Зачем связывать библиотеки (например, pthread), когда они находятся в нужных папках "/ lib" и "/ usr / lib"? - PullRequest
5 голосов
/ 06 марта 2011

1. Почему нам нужно связать нестандартные библиотеки / включить нестандартные заголовочные файлы, когда они уже находятся в нужной папке

anirudh@anirudh-Aspire-5920:~/Documents/DUMP$ locate libpthread
/lib/libpthread-2.12.1.so
/lib/libpthread.so.0
/usr/lib/libpthread.a
/usr/lib/libpthread.so
/usr/lib/libpthread_nonshared.a
/usr/lib/xen/libpthread.a
/usr/lib/xen/libpthread_nonshared.a
anirudh@anirudh-Aspire-5920:

Справочная страница ld.so/ld-linux.so - dynamic linker/loader говорит, что необходимые библиотеки, необходимые программе, ищутся In the default path /lib, and then /usr/lib. Когда файл .so моей библиотеки уже находится в папке / lib, тогда зачем мне нужно связывать его исключительно. Также опция -l используется для связывания статических библиотек. но когда я делаю pmap процесса, я вижу, что используется динамическая библиотека pthread с расширением .so, а не библиотека с расширением .a. Аналогично

anirudh@anirudh-Aspire-5920:~/Documents/DUMP$ locate mysql.h
/usr/include/mysql/mysql.h
anirudh@anirudh-Aspire-5920:~/Documents/DUMP$

Если он уже присутствует в папке /usr/include, которая является стандартной папкой для всех заголовочных файлов, тогда зачем мне включать его исключительно с помощью опции -I.

1 Ответ

10 голосов
/ 06 марта 2011
  1. Хотя компоновщик ищет в /lib и /usr/lib запрошенные библиотеки, это не означает, что он автоматически загружает все этих библиотек. Загрузка библиотеки - довольно дорогая операция, поэтому компоновщик загружает только те библиотеки, которые, как он знает, понадобятся. -l говорит о том, что библиотека нужна. Существуют некоторые операционные системы и наборы инструментов, которые автоматически пытаются выяснить, какие библиотеки необходимы, основываясь на директивах в заголовках (Visual C ++ делает это в Windows), но этот метод не используется в Linux.
  2. -l используется как для статических, так и для общих библиотек. Если присутствуют оба, будет использоваться общая версия, если только компоновщику не указано -static.
  3. Если вы #include <mysql/mysql.h>, препроцессор будет искать его в /usr/include/mysql/mysql.h. То есть, поиск не рекурсивный - если вы укажете <mysql.h>, препроцессор будет смотреть на /usr/include/mysql.h, но не /usr/include/mysql/mysql.h.
...