C LD_LIBRARY_PATH,linux中的共享库路径

C LD_LIBRARY_PATH,linux中的共享库路径,c,linux,shared-libraries,C,Linux,Shared Libraries,我编写了一个共享对象,比如说libsd.so,我将libsd.so及其头文件sd.h放在~/lib中 下面是另一个使用libsd.so的程序,比如说test.c,然后像这样编译它: $ gcc -o test test.c -I~/lib -L~/lib -lsd $ ./test ./test_sd: error while loading shared libraries: libsd.so: cannot open shared object file: No such file or

我编写了一个共享对象,比如说
libsd.so
,我将
libsd.so
及其头文件
sd.h
放在
~/lib

下面是另一个使用
libsd.so
的程序,比如说
test.c
,然后像这样编译它:

$ gcc -o test test.c -I~/lib -L~/lib -lsd
$ ./test
./test_sd: error while loading shared libraries: libsd.so: cannot open shared object file: No such file or directory
然后我像这样运行
test

$ gcc -o test test.c -I~/lib -L~/lib -lsd
$ ./test
./test_sd: error while loading shared libraries: libsd.so: cannot open shared object file: No such file or directory
所以我设置了导出LD\u库路径=。,然后它就可以工作了。但是如果我
取消设置LD\u LIBRARY\u PATH
并将
LD\u LIBRARY\u PATH=~/lib
放在我的
~/.bashrc
中,那么
源代码~/.bashrc
,它同样不适用于
/test
,为什么


export-LD\u LIBRARY\u PATH=~/lib
与将
LD\u LIBRARY\u PATH=~/lib
放入
/.bashrc

尝试
$HOME/lib
而不是
~/lib
-应该是一样的,但我见过在变量赋值中使用
~/code>时没有正确展开的情况

要进行检查,请尝试
echo$LD\u LIBRARY\u PATH
,该路径提供当前值


Re
export
:如果省略
export
,则该变量仅为当前shell进程所知,不会导出到子进程。因此,如果省略它,
echo$LD_LIBRARY_PATH
将获得该值,因为在
echo
命令/builtin有机会执行任何操作之前,该变量由shell展开。但是
/test
不会看到它,因为它没有导出到新的子流程。

尝试
$HOME/lib
而不是
~/lib
-应该是相同的,但我见过
~
在变量赋值中使用时没有正确展开的情况

要进行检查,请尝试
echo$LD\u LIBRARY\u PATH
,该路径提供当前值


Re
export
:如果省略
export
,则该变量仅为当前shell进程所知,不会导出到子进程。因此,如果省略它,
echo$LD_LIBRARY_PATH
将获得该值,因为在
echo
命令/builtin有机会执行任何操作之前,该变量由shell展开。但是
/test
不会看到它,因为它不会导出到新的子流程。

如果没有导出,您声明的LD_库路径仅在脚本(.bashrc)中有效。 对于导出,它应该可以工作,但是像这样设置LD_LIBRARY_路径通常不是一个好主意


如果您不想在系统路径(例如/usr/lib)中安装库,您可能应该使用在本地设置LD_LIBARAY_路径并启动应用程序的脚本。

没有导出,您声明的LD_libray_路径仅在脚本(.bashrc)中有效。 对于导出,它应该可以工作,但是像这样设置LD_LIBRARY_路径通常不是一个好主意


如果您不想在系统路径(例如/usr/lib)中安装库,您可能应该使用在本地设置LD_LIBARAY_路径并启动应用程序的脚本。

替换为I
source~/.bashrc
,和
echo$LD_library_path
给出当前值,您的意思是如果我想
/test
工作,我仍然应该导出LD_库路径
?是的,您必须始终导出LD_库路径,否则它将无效。替换为I
source~/.bashrc
,和
echo$LD_库路径
给出当前值,您的意思是如果我希望
/test
工作,我仍然应该
导出LD\u LIBRARY\u PATH
?是的,您必须始终
导出LD\u LIBRARY\u PATH
,否则它将无效。那么,为什么这不是一个好主意呢?你能详细解释一下吗?你可以在这里看到,为什么这不是一个好主意:然而,看起来,你甚至不应该在脚本中使用它,而是应该使用-R选项。我使用的是Fedora而不是Solaris,但是gcc中是否有一个
-R
?在Fedora上应该有-rpath,这应该可以做几乎相同的事情,尽管我实际上不太清楚,为什么这不是个好主意?你能详细解释一下吗?你可以在这里看到,为什么这不是一个好主意:然而,看起来,你甚至不应该在脚本中使用它,而是应该使用-R选项。我使用的是Fedora而不是Solaris,但是gcc中是否有一个
-R
?在Fedora上应该有-rpath,这应该可以做几乎相同的事情,虽然我实际上不知道确切的情况。