未找到 /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/lib
see 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
环境变量的路径:
二是更新运行时链接器的配置文件。这可以在 /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
。因此,您需要将其添加到您的链接标志中:
不过,我不建议您这样做。当您将库与可执行文件(可能带有安装程序)一起发送时,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”
dyld:未加载库:/usr/local/lib/liblua.5.1.5.dylib