c++ - 未找到/usr/local/lib 中的库

我正在使用名为 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/

相关文章:

java - 在java中构建URL

c++ - 在 Sublime Text 中构建系统

build - 即使测试失败,Teamcity 也会运行构建步骤

git - 为什么我的 TeamCity 构建停止工作?

build - 具有项目编译依赖项的 Gradle 嵌套多项目

build - 在 CentOS/RHEL 上制作和构建实用程序?

groovy - Gradle:强制自定义任务始终运行(无缓存)

带有 CLI 的 Angular 2 - 为生产而构建

visual-studio - Visual Studio : debug information

go - 如何正确使用构建标签?