我正在使用名为 ohNet 的框架构建应用程序。
构建框架后,可以通过 make install
安装框架。默认情况下,这些库安装在 /usr/local/[lib|include]
文件夹中。好的。
我正在使用 Eclipse 进行开发。为了使用这个库,我必须设置库的包含路径(在本例中为 usr/local/include/ohNet
),设置链接器搜索路径 (-L)(/usr/local/lib/ohNet
) 和特定的库 (-l) .
当我在 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 中查找库。你可以通过两种方式做到这一点。首先是添加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
功能)或绝对路径(当您安装在/时)一起提供时,rpath 很有用opt,例如)然后用于在运行时查找那些捆绑的库。
https://stackoverflow.com/questions/17889799/