我写了一个共享对象,比如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
,然后source ~/.bashrc
,那么它再次对./test
无效,为什么?
export LD_LIBRARY_PATH=~/lib
与将LD_LIBRARY_PATH=~/lib
放入~/.bashrc
?
答案 0 :(得分:4)
如果没有导出,则声明的LD_LIBRARY_PATH仅在脚本(.bashrc)中有效。 使用导出它应该工作,但通常不是这样设置LD_LIBRARY_PATH。
如果您不想在系统路径中安装库(例如/ usr / lib),则应该使用在本地设置LD_LIBARAY_PATH并启动应用程序的脚本。
答案 1 :(得分:2)
尝试使用$HOME/lib
代替~/lib
- 应该相同但我看到~
在使用时未正确展开的情况变量赋值。
要查看,请尝试echo $LD_LIBRARY_PATH
,它会为您提供当前值。
Re export
:如果省略export
,则该变量仅为当前shell进程所知,并且不会导出到子进程。因此,如果省略它,echo $LD_LIBRARY_PATH
将获得该值,因为在 echo
命令/ builtin有机会执行任何操作之前,变量由shell 扩展。但./test
将无法看到它,因为它未导出到新的子流程。