为什么每次运行我的应用程序时都必须使用导出来定义LD_LIBRARY_PATH?

我有一些使用一些共享库的代码(在gcc上的c代码)。 在编译时,我必须使用-I和-L显式地定义include和库目录,因为它们不在标准位置。 当我尝试运行代码时,出现以下错误:

./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/" 

使用

 export LD_LIBRARY_PATH="/path/to/library/" 

否则,你的.bashrc只能用于bash而不是你启动的任何程序。

尝试-R/path/to/library/标志链接时,它会使该程序在该目录中查找,您将不需要设置任何环境variables。

编辑:看起来像-R只是Solaris,而你在Linux上。

另一种方法是将path添加到/etc/ld.so.conf并运行ldconfig 。 请注意,这是一个适用于所有dynamic链接二进制文件的全局更改。

您应该避免在.bashrc设置LD_LIBRARY_PATH 。 有关更多信息,请参阅“ Why LD_LIBRARY_PATH is bad ” 。

在链接时使用链接器选项-rpath ,以便dynamic链接器在运行时知道在哪里findlibsync.so

 gcc ... -Wl,-rpath /path/to/library -L/path/to/library -lsync -o sync_test 

编辑:

另一种方法是使用这样的包装

 #!/bin/bash LD_LIBRARY_PATH=/path/to/library sync_test "$@" 

如果sync_test启动任何其他程序,他们可能会最终使用/path/to/library的libs可能或不可能。

你在.bashrc中输出吗?

 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"/path/to/library" 

你可以把这一切放在一行上:

 LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/path/to/library" ./sync_test 

应该让事情变得容易一点,即使它没有改变任何根本

而不是在运行时用LD_LIBRARY_PATH覆盖库searchpath,而是可以用rpath将其rpath入二进制文件本身。 如果你用GCCjoin了-Wl,-rpath,<libdir>就可以了,如果你用ld连接它只是-rpath <libdir>

你也可以做什么,如果它是你的系统上安装的东西,就是将包含共享库的目录添加到/etc/ld.so.conf文件中,或者在/etc/ld.so中创build一个新文件。 conf.d /

(我已经检查了RHEL5和Ubuntu发行版,所以我认为这是Linux通用的)

ldconfig程序将确保它们包含在系统范围内。

有关更多信息,请参阅以下链接: http://www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/dlls.html

您可以在新代码中添加一个呼叫系统:

 sprintf(newdef,"export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:%s:%s",ld1,ld2); system(newdef); 

但是,我不知道这是最好的解决scheme,但它的工作原理。

问候