Подтвердить что ты не робот

Почему я должен определять LD_LIBRARY_PATH с экспортом каждый раз, когда запускаю приложение?

У меня есть код, который использует некоторые общие библиотеки (c-код на gcc). При компиляции я должен явно определять каталоги include и library, используя -I и -L, так как они не находятся в стандартных местах. Когда я пытаюсь запустить код, я получаю следующую ошибку:

./sync_test 
./sync_test: error while loading shared libraries: libsync.so: cannot open shared object file: No such file or directory

Однако выполните следующие действия: все работает отлично:

export LD_LIBRARY_PATH="/path/to/library/"
./sync_test

Теперь, странная часть, это работает только один раз. Если я попытаюсь запустить sync_test снова, я получаю ту же ошибку, если не запускаю команду экспорта в первую очередь. Я попытался добавить следующее к моему .bashrc, но это не имело значения:

LD_LIBRARY_PATH="/path/to/library/"
4b9b3361

Ответ 1

Использование

export LD_LIBRARY_PATH="/path/to/library/"

в вашем .bashrc в противном случае, он будет доступен только для bash, а не для запуска каких-либо программ.

Попробуйте -R/path/to/library/ флаг, когда вы связываетесь, это заставит программу смотреть в этом каталоге, и вам не нужно будет устанавливать какие-либо переменные среды.

EDIT: Похоже, что -R - это только Solaris, и вы находитесь в Linux.

Альтернативным способом было бы добавить путь к /etc/ld.so.conf и запустить ldconfig. Обратите внимание, что это глобальное изменение, которое будет применяться ко всем динамически связанным двоичным файлам.

Ответ 2

Вам следует избегать установки LD_LIBRARY_PATH в .bashrc. Подробнее см. "Why LD_LIBRARY_PATH is bad" .

Используйте параметр компоновщика - rpath при связывании, чтобы динамический компоновщик знал, где найти libsync.so во время выполнения.

gcc ... -Wl,-rpath /path/to/library -L/path/to/library -lsync -o sync_test

EDIT:

Другим способом было бы использовать обертку, подобную этой

#!/bin/bash

LD_LIBRARY_PATH=/path/to/library sync_test "[email protected]"

Если sync_test запускает любые другие программы, они могут использовать libs в /path/to/library, которые могут быть или не быть предназначены.

Ответ 3

Вы экспортировали 'в свой .bashrc?

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"/path/to/library"

Ответ 4

Вы можете просто поместить это все в одну строку:

LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/path/to/library" ./sync_test

Делать вещи немного легче, даже если это не изменит ничего фундаментального

Ответ 5

Вместо того, чтобы переопределять путь поиска библиотеки во время выполнения с помощью LD_LIBRARY_PATH, вы можете вместо этого испечь его в самом двоичном формате с помощью rpath. Если вы связываетесь с добавлением GCC, -Wl,-rpath,<libdir> должен сделать трюк, если вы связываете его с ld, просто -rpath <libdir>.

Ответ 6

Что вы также можете сделать, если это то, что вы установили в своей системе, - это добавить каталог, содержащий разделяемые библиотеки, в ваш файл /etc/ld.so.conf или сделать новый файл в /etc/ld.so.conf.d/

(Я проверил RHEL5 и дистрибутив Ubuntu, поэтому я думаю, что он является общим для Linux)

Программа ldconfig проверит, что они включены в общую систему.

Для получения дополнительной информации см. следующую ссылку: www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/dlls.html

Ответ 7

Вы можете добавить в свой код систему вызовов с новым определением:

sprintf(newdef,"export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:%s:%s",ld1,ld2);
system(newdef);

Но я не знаю, что это решение, но оно работает.

Привет