未找到 /usr/local/lib 中的库

Posted

技术标签:

【中文标题】未找到 /usr/local/lib 中的库【英文标题】:Libraries in /usr/local/lib not found 【发布时间】:2013-07-27 05:19:43 【问题描述】:

我正在使用名为ohNet 的框架构建应用程序。 构建框架后,可以通过make install 安装框架。默认情况下,这些库安装在 /usr/local/[lib|include] 文件夹中。好的。

我正在使用 Eclipse 进行开发。为了使用这个库,我必须设置库的包含路径(在本例中为 usr/local/include/ohNet),设置链接器搜索路径(-L)(/usr/local/lib/ohNet)和特定库(-l)(在本例中我选择了一个名为libohNet.so 的库,它在此文件夹中。 当我在 Eclipse 中构建项目时,它工作正常,但是如果我尝试运行该程序,我会遇到以下消息:

error while loading shared libraries: libohNet.so: cannot open shared object file: No such file or directory

我已经仔细检查过,文件libohNet.so 就在这个目录中! 找不到这个文件是什么原因?

我在谷歌上搜索并找到了一些帖子,说库安装到/usr/local/lib而不是/usr/libsee here是有问题的... 我是否必须在eclipse 中配置一些其他设置才能使ld 识别此路径中的库?有什么办法解决这个问题?

问候

【问题讨论】:

-L /usr/local/lib 添加到您的链接器行。 我已经将链接器搜索路径设置为/usr/local/lib/ohNet 那么您需要检查您是否可以真正读取该文件,并且它是正确的 .so 文件类型 - 例如,混合 32 位和 64 位? unix.stackexchange.com/questions/67781/… 【参考方案1】:

这是运行时错误,而不是构建错误。设置-L 标志对运行时链接器没有任何作用。您需要做的是告诉运行时加载程序也在 /usr/local/lib 中查找库。你可以通过两种方式做到这一点。首先是添加LD_LIBRARY_PATH环境变量的路径:

导出 LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib"

二是更新运行时链接器的配置文件。这可以在 /etc/ld.so.conf 文件中发生,方法是:

/usr/local/lib

在该文件的某个位置,或者通过在包含新路径的 /etc/ld.so.conf.d/ 目录中创建一个新的 *.conf 文件。例如:

/etc/ld.so.conf.d/99local.conf

只需:

/usr/local/lib

在里面。这是这样做的推荐方式,因为它允许您将自定义库路径与系统设置的路径分开。 (“99”前缀是为了确保文件与那里的其他文件相比最后加载,这样它就不会抢占可能包含相同库的系统路径。)

在/etc中修改/创建文件后,需要运行:

配置文件

以 root 身份使更改生效。 (此命令更新 /etc/ld.so.cache 文件,这是运行时链接器使用的实际文件。)

二进制文件还有另一种方法可以在运行时找到所需的库。您实际上可以将库路径硬编码到可执行文件本身中。这是通过设置所谓的“rpath”来实现的。这是一个链接器选项,必须从 gcc(或 g++)传递到链接器,因此必须使用 -Wl 选项。链接器选项是-rpath=PATH。因此,您需要将其添加到您的链接标志中:

-Wl,-rpath=/usr/local/lib

不过,我不建议您这样做。当您将库与可执行文件(可能带有安装程序)一起发送时,rpath 很有用,然后是相对 rpath(使用rpath $ORIGIN 功能)或绝对路径(例如,当您在 /opt 中安装时)用于在运行时查找那些捆绑的库。

【讨论】:

感谢您的准确回答。如果我的库位于 /usr/local/lib 的子文件夹中(例如 /usr/local/lib/ohNet),我必须将每个路径添加到子文件夹。有什么办法可以告诉运行时加载程序递归地在 /usr/loal/lib 中搜索? @user1291235 您必须将每个单独的路径分别添加到自己的行中。 @user1291235 我忘了提到 rpath 链接选项。在您的情况下,我不建议这样做,但很高兴知道,所以我已将其添加到答案中。 @NikosC。我只是想登录让您知道ldconfig 行只是为我节省了几个小时的工作时间。由于我无法理解的原因,从源代码安装无法重新加载缓存,因此找不到我的库。投赞成票! 请注意,您应该已经在/etc/ld.so.conf.d/libc.conf 中定义了/usr/local/lib。该文件来自libc-bin。如果您移动了库,运行 ldconfig 将唤醒它。

以上是关于未找到 /usr/local/lib 中的库的主要内容,如果未能解决你的问题,请参考以下文章

El Capitan 升级:未加载库:/usr/local/lib/libmysqlclient.18.dylib

imagemagick 识别给出“dyld:未加载库:/usr/local/lib/libtiff.3.dylib”

/usr/local/lib 的 OS X 权限被拒绝

dyld:未加载库:/usr/local/lib/liblua.5.1.5.dylib

使用ldconfig命令将/usr/local/lib加入到默认库

Node-gyp库未加载:/usr/local/lib/libmtp.9.dylib