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

时间:2013-07-26 19:47:57

标签: c++ eclipse build linker libraries

我正在使用名为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就在这个目录中! 是什么原因导致无法找到此文件?

我在google上搜索并发现了一些帖子,说有问题是将库安装到/usr/local/lib而不是/usr/lib see here ... 我是否必须在eclipse中配置一些其他设置,以使ld识别此路径中的库?这是什么解决方案?

问候

1 个答案:

答案 0 :(得分:57)

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

ldconfig

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

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

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

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