Есть два ответа на этот вопрос, часть ответа заключается в компоновке во время компиляции (т.е. gcc -lfoo -L/usr/lib
..., которая, в свою очередь, вызывает ld
), и поиске компоновщика во время выполнения.
Когда вы компилируете свою программу, компилятор проверяет синтаксис, и затем компоновщик гарантирует, что символы, необходимые для выполнения, существуют (например, переменные / методы / и т. Д.), Среди прочего. LD_LIBRARY_PATH
, как было отмечено, имеет побочный эффект изменения способа поведения gcc
/ ld
, а также поведения компоновщика во время выполнения путем изменения пути поиска.
Когда вы запускаете вашу программу, компоновщик во время выполнения фактически выбирает общие библиотеки (на диске или из памяти, если это возможно) и загружает в совместно используемые символы / код / и т. Д. Опять же, LD_LIBRARY_PATH
неявно влияет на этот путь поиска (иногда не очень хорошая вещь, как уже упоминалось.)
Правильное решение этой проблемы без использования LD_LIBRARY_PATH
в большинстве систем Linux - добавить путь, содержащий ваши общие библиотеки, в /etc/ld.so.conf
(или в некоторых дистрибутивах создать файл в /etc/ld.so.conf.d/
с путем в нем) и запустите ldconfig
(/sbin/ldconfig
от имени пользователя root), чтобы обновить кэш привязок компоновщика среды выполнения.
Пример в Debian:
jewart@dorfl:~$ cat /etc/ld.so.conf.d/usrlocal.conf
/usr/local/lib
Затем, когда программа будет выполнена, компоновщик во время выполнения будет искать в этих каталогах библиотеки, с которыми был связан ваш двоичный файл.
Если вы хотите узнать, о каких библиотеках знает компоновщик времени выполнения, вы можете использовать:
jewart@dorfl:~$ ldconfig -v
/usr/lib:
libbfd-2.18.0.20080103.so -> libbfd-2.18.0.20080103.so
libkdb5.so.4 -> libkdb5.so.4.0
libXext.so.6 -> libXext.so.6.4.0
И, если вы хотите знать, с какими библиотеками связан бинарный файл, вы можете использовать ldd
, например, такой, который сообщит вам, какую библиотеку выберет ваш компоновщик времени выполнения:
jewart@dorfl:~$ ldd /bin/ls
linux-vdso.so.1 => (0x00007fffda1ff000)
librt.so.1 => /lib/librt.so.1 (0x00007f5d2149b000)
libselinux.so.1 => /lib/libselinux.so.1 (0x00007f5d2127f000)
libacl.so.1 => /lib/libacl.so.1 (0x00007f5d21077000)
libc.so.6 => /lib/libc.so.6 (0x00007f5d20d23000)