2012-02-23 3 views
2

Я написал общий объект, скажем libsd.so, и я положил libsd.so и его заголовочный файл sd.h в ~/lib.LD_LIBRARY_PATH, общий путь lib в linux

Вот еще одна программа, использующая libsd.so, скажем test.c, затем компилировать его, как это:

$ gcc -o test test.c -I~/lib -L~/lib -lsd 

Тогда я бегу test так:

$ ./test 
./test_sd: error while loading shared libraries: libsd.so: cannot open shared object file: No such file or directory 

Поэтому я export LD_LIBRARY_PATH=., то он работает. Но если я unset LD_LIBRARY_PATH и положил LD_LIBRARY_PATH=~/lib в мои ~/.bashrc, то source ~/.bashrc, опять же он не работает для ./test, ПОЧЕМУ?

export LD_LIBRARY_PATH=~/lib есть отличие от сдачи LD_LIBRARY_PATH=~/lib в ~/.bashrc?

ответ

4

Без экспорта заявленная LD_LIBRARY_PATH действительна только в скрипте (.bashrc). С экспортом он должен работать, но обычно не рекомендуется устанавливать LD_LIBRARY_PATH таким образом.

Если вы не хотите устанавливать свою библиотеку в системный путь (например,/usr/lib), вероятно, вы должны использовать скрипт, который локально устанавливает LD_LIBARAY_PATH и запускает ваше приложение.

+0

Ну, почему это не очень хорошая идея? не могли бы вы рассказать об этом? – Alcott

+2

Вы можете видеть здесь, почему это не очень хорошая идея: http://linuxmafia.com/faq/Admin/ld-lib-path.html Однако кажется, что вы даже не должны использовать его в скрипте, но скорее используйте опцию -R – Tim

+0

Я использую Fedora, а не Solaris, но есть ли '-R' в gcc? – Alcott

2

Попробуйте $HOME/lib вместо ~/lib - это должна быть таким же, но я видел случаи, когда ~ не был расширен должным образом, когда используется в переменном назначении.

Чтобы проверить, попробуйте echo $LD_LIBRARY_PATH, который дает текущее значение.

Re export: Если вы опустите export, то переменная известна только текущему процессу оболочки и не будет экспортирована в дочерние процессы. Поэтому, если вы его опустите, echo $LD_LIBRARY_PATH получит значение, потому что переменная расширяется оболочкой до Команда echo имеет встроенную команду. Но ./test не увидит его, потому что он не экспортируется в новый подпроцесс.

+0

Заменено, я 'source ~/.bashrc' и' echo $ LD_LIBRARY_PATH' дает текущее значение, вы имеете в виду, если я хочу './Test' работать, я все равно должен« экспортировать LD_LIBRARY_PATH'? – Alcott

+0

Да, вы всегда должны «экспортировать LD_LIBRARY_PATH» или это не будет иметь никакого эффекта. –