我正在使用名为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
识别此路径中的库?这是什么解决方案?
问候
答案 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非常有用然后用于在运行时找到那些捆绑的库。