47

我有一些使用一些共享库的代码(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,我会得到同样的错误,除非我先运行导出命令。我尝试将以下内容添加到我的 .bashrc 中,但没有任何区别:

LD_LIBRARY_PATH="/path/to/library/"
4

7 回答 7

47

你应该避免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可能或可能不打算使用的库。

于 2009-03-30T00:20:00.300 回答
44

采用

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

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

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

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

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

于 2009-03-29T22:46:01.353 回答
11

您可以将所有内容放在一行中:

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

应该让事情变得更容易一些,即使它不会改变任何基本的东西

于 2009-03-29T23:12:29.307 回答
10

您是否在 .bashrc 中“导出”?

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"/path/to/library"
于 2009-03-29T22:44:32.260 回答
5

与其在运行时使用 LD_LIBRARY_PATH 覆盖库搜索路径,不如使用rpath. 如果您与 GCC 链接添加-Wl,-rpath,<libdir>应该可以解决问题,如果您与 ld 链接它只是-rpath <libdir>.

于 2012-08-07T15:58:03.017 回答
2

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

(我已经检查了 RHEL5 和 Ubuntu 发行版,所以我认为它对于 linux 来说是通用的)

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

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

于 2009-03-30T07:03:41.203 回答
1

您可以在代码中添加具有新定义的呼叫系统:

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

但是,我不知道这是正确的解决方案,但它有效。

问候

于 2016-10-24T21:36:49.717 回答