Почему я должен определять 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/"
Ответы
Ответ 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);
Но я не знаю, что это решение, но оно работает.
Привет