我有一个使用一些共享库(上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);

不过,我不知道那是分辩解决方案,但它的工作原理。

此致

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top