40

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

我正在使用 eclipse 进行开发。为了使用这个库,我必须设置库的包含路径(在这种情况下usr/local/include/ohNet),设置链接器搜索路径(-L)(/usr/local/lib/ohNet)和特定库(-l)(在这种情况下,我选择一个名为libohNet.sowhich这个文件夹中。当我在 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识别此路径中的库?解决方案是什么?

问候

4

1 回答 1

82

这是运行时错误,而不是构建错误。设置-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 中修改/创建文件后,您需要运行:

配置文件

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

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

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

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

于 2013-07-26T23:58:48.020 回答