30

我在链接期间收到以下警告:

/usr/bin/ld: warning: libxxx.so.6, needed by /a/b/c/libyyy.so, not found (try using -rpath or -rpath-link)

设置环境变量 LD_LIBRARY_PATH=path_to_libxxx.so.6 使警告静音(添加 -Lpath_to_libxxx.so.6 没有帮助)。

我有一个单独的编译服务器,只编译生成的二进制文件。二进制文件在其他服务器上执行,并且二进制文件可以看到 libxxx.so.6(用 选中ldd executable)。

有没有其他方法可以在编译时消除警告(我有好几次,这很烦人)?

4

4 回答 4

42

您需要添加等效的动态库-L

-Wl,-rpath-link,/path/to/lib

这将导致链接器在非标准位置查找共享库,但仅用于验证链接是否正确。

如果您希望程序在运行时找到该位置的库,那么有一个类似的选项可以做到这一点:

-Wl,-rpath,/path/to/lib

但是,如果你的程序在没有这个的情况下运行良好,那么你就不需要它。

于 2012-11-30T13:41:14.663 回答
6

确保运行时链接器知道所需库的路径。这是通过在 /etc/ld.so.conf.d/ 中添加一个具有所需路径的文件来完成的。例如,/etc/ld.so.conf.d/foo 具有以下内容:

/usr/local/lib/foo/

如果您有一个非常旧的 Linux 版本,可能不支持 /etc/ld.so.conf.d/,在这种情况下,您可能必须将路径直接添加到 /etc/ld.so.conf 文件中。

完成之后,您需要通过执行“ldconfig”命令来更新链接器的数据库。

于 2012-11-22T07:35:02.420 回答
2

我知道这很旧,但这里有一个更好的解决方法:

根本原因:

当 GCC 调用的 LD 开始解析库依赖关系时,问题实际上就发生了。GCC 和 LD 都知道包含库的 sysroot,但是 LD 可能缺少一个关键组件:/etc/ld.so.conf 文件。这是来自 Raspberry PI 系统的 exampleld.so.conf 文件:

包括 /etc/ld.so.conf.d/*.conf

/etc/ld.so.conf.d 目录包含以下文件:

00-vmcs.conf: /opt/vc/lib

arm-linux-gnueabihf.conf:

/lib/arm-linux-gnueabihf /usr/lib/arm-linux-gnueabihf

libc.conf:

/usr/local/lib

通用解决方案

 

通过将 LD 配置文件复制到跨工具链的 LD 可以找到它们的位置,可以轻松解决该问题。但是有一个陷阱:如果您的跨工具链是使用 MinGW 构建的(大多数都是),它可能无法访问 glob() 函数,因此它将无法解析启用通配符的包含语句,如 *.conf . 这里的解决方法是手动组合 /etc/ld.so.conf.d 中所有 .conf 文件的内容并将它们粘贴到/etc/ld.so.conf

*/opt/vc/lib

/lib/arm-linux-gnueabihf

/usr/lib/arm-linux-gnueabihf

/usr/local/lib*

在正确的文件夹中创建 ld.so.conf 文件后,您的工具链将能够自动解析所有共享库引用,您将不会再看到该错误消息!

于 2016-08-16T19:32:29.920 回答
1

使用命令行选项使这些警告静音的唯一方法是 -L 标志,奇怪的是它对您不起作用(也许您可以发布更多详细信息)。由于警告是由我们生成的,ld我们可以尝试使用-Wl,option来禁用链接器警告,但是从GNU ld 的文档来看,没有(取消)激活此警告的选项。

所以这让我们不得不编写一个包装脚本来过滤掉这个警告或编译一个自定义版本的ld.

于 2012-11-30T13:26:49.663 回答