在 /usr/local/lib 中找不到库

44

我正在使用一个叫做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可能会出现问题请看这里...我需要在eclipse中配置额外的设置才能让ld识别这个路径中的库吗?解决方法是什么?

致意


-L /usr/local/lib添加到您的链接器行。 - Mats Petersson
我已经将链接器搜索路径设置为/usr/local/lib/ohNet - Moonlit
然后您需要检查您是否可以实际读取该文件,以及它是否是正确类型的.so文件 - 例如,混合32位和64位? - Mats Petersson
http://unix.stackexchange.com/questions/67781/use-shared-libraries-in-usr-local-lib - Ciro Santilli OurBigBook.com
1个回答

92

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

export 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身份运行:

ldconfig

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

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

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

虽然你的情况我不建议使用这种方法。当你需要将库与可执行文件一起发布(可能是通过安装程序),使用rpath是很有用的,相对路径(使用rpath $ORIGIN功能)或绝对路径(例如在/opt中安装时)可用于在运行时查找这些捆绑的库。


感谢您提供精确的答案。如果我的库位于 /usr/local/lib 的子文件夹中(例如 /usr/local/lib/ohNet),我必须将每个路径添加到子文件夹中。有没有办法告诉运行时加载器递归搜索 /usr/local/lib? - Moonlit
@user1291235 你必须在每一行单独添加每个路径。 - Nikos C.
2
@user1291235 我忘记提到 rpath 连接选项了。在你的情况下,我不建议使用它,但知道这个选项也是好事,所以我已经将它添加到答案中了。 - Nikos C.
3
@NikosC. 我只是想登录并告诉你那个 ldconfig 命令行刚刚节省了我数小时的工作。由于某些我无法理解的原因,从源代码安装后无法重新加载缓存,所以我的库文件找不到。谢谢你! - Ron Thompson
4
请注意,你应该已经在 /etc/ld.so.conf.d/libc.conf 中定义了 /usr/local/lib。这个文件来自于 libc-bin。如果你移动了你的库文件,运行 ldconfig 命令将会激活它。 - Alexis Wilke
“-rpath” 正是我所需要的。 - Iiridayn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接