为什么每次运行我的应用程序时都必须使用导出来定义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,但它的工作原理。
问候