我为什么要每次运行我的应用程序的时间定义与出口LD_LIBRARY_PATH?
-
22-08-2019 - |
题
我有一个使用一些共享库(上GCC C代码)的一些代码。编译当我有明确定义包括和使用-I和-L,因为它们不是标准的地方库目录。当我尝试运行代码,我收到以下错误:
./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我再次得到了同样的错误,除非我先运行export命令。我尝试添加以下到我的.bashrc,但它并没有区别:
LD_LIBRARY_PATH="/path/to/library/"
解决方案
使用
export LD_LIBRARY_PATH="/path/to/library/"
在你的.bashrc否则,它只会提供给bash和不启动任何程序。
尝试,当你链接-R/path/to/library/
标志,它会让该目录下的程序看,你不需要设置任何环境变量。
编辑:看起来像-R
是仅Solaris,和你在Linux
的另一种方法是添加到/etc/ld.so.conf
和运行ldconfig
的路径。请注意,这是一个将适用于所有动态链接的二进制文件的全球变化。
其他提示
您应避免在LD_LIBRARY_PATH
设置.bashrc
。请参阅 “Why LD_LIBRARY_PATH is bad
” 获得更多的信息。
而连接,使得使用链接器选项 -rpath 动态链接程序知道在哪里可以在运行时期间发现libsync.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
的库,其可以或可以不旨在。
你有没有 '出口' 在你的.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运行时库搜索路径,你可以改为烘烤成二进制本身rpath
。如果你使用GCC添加-Wl,-rpath,<libdir>
应该做的伎俩,如果你使用ld链接它只是-rpath <libdir>
链接。
您还可以做什么,如果它是你的系统上安装的东西,是添加包含共享库您的 /etc/ld.so.conf中文件的目录,或进行在新文件中的 /etc/ld.so.conf.d / 强>
(我托运RHEL5和Ubuntu发行版,所以我认为这是通用于Linux)
在程序LDCONFIG将确保它们全系统包括在内。
请参阅下面的链接的详细资料: 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);
不过,我不知道那是分辩解决方案,但它的工作原理。
此致