我写了一个共享对象,说libsd.so
,我把libsd.so
和它的头文件sd.h
放在~/lib
。
这里是另一个使用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
,那么./test
source ~/.bashrc
再次不能用于./test
,为什么?
export LD_LIBRARY_PATH=~/lib
与将LD_LIBRARY_PATH=~/lib
放在~/.bashrc
?
如果没有导出,则声明的LD_LIBRARY_PATH仅在脚本(.bashrc)中有效。 有了导出它应该可以工作,但是像这样设置LD_LIBRARY_PATH通常不是一个好主意。
如果您不想在系统路径中安装库(例如/ usr / lib),则应该使用在本地设置LD_LIBARAY_PATH的脚本并启动您的应用程序。
尝试$HOME/lib
而不是~/lib
– 它应该是相同的,但是我已经看到了~
在使用变量赋值时不能正确展开的情况。
要检查,请尝试echo $LD_LIBRARY_PATH
,它给你的当前值。
重新export
:如果你省略了export
,那么这个变量只对当前的shell进程是已知的,不会被导出到子进程。 所以,如果你忽略它, echo $LD_LIBRARY_PATH
将会得到这个值,因为这个变量在shell命令/内建函数有可能做任何事情之前被shell扩展了。 但./test
将不会看到它,因为它不会导出到新的子./test
。