【问题标题】:Get rid of "gcc - /usr/bin/ld: warning lib not found"摆脱“gcc - /usr/bin/ld:未找到警告库”
【发布时间】:2012-11-10 13:12:48
【问题描述】:

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

/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 检查)。

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

【问题讨论】:

  • 请澄清您的问题。当你编译和链接程序时会发生什么,当你尝试运行它时会发生什么。
  • @NikosC。在问题中澄清

标签: linux gcc compilation


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

    确保运行时链接器知道所需库的路径。这是通过在 /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”命令来更新链接器的数据库。

    【讨论】:

    • 我在编译完成的服务器中没有root权限。服务器用于编译,二进制文件不会在其上执行。第一个问题是为什么在 link 时我需要处理运行时环境,第二个问题是如何摆脱警告。
    • @dimba 你不必照顾它。这只是一个警告,通知您二进制文件不会在当前机器上运行。至于如何在链接期间不使用 rpath 来禁用警告,我不知道。 (使用 rpath 通常不是一个好主意,除非您将库与可执行文件捆绑在一起。)如果您没有 root 权限,那么 LD_LIBRARY_PATH 是您唯一的选择。
    【解决方案3】:

    我知道这是旧的,但是here's a better fix:

    根本原因:

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

    包括 /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 文件后,您的 工具链将能够解析所有共享库引用 自动,您将不会再看到该错误消息!

    【讨论】:

    • 非常感谢,很好地解决了这个问题!值得一提的是 /etc/ld.so.conf 应该创建在工具链的 target sysroot 中,而不是 host 中。
    • 嗨!您能否更具体地说明“工具链的目标 sysroot”是什么?在我的应用程序中,工具链不在 sysroot 中,它们位于不同的路径中: * /path-to/sysroot * /path-to/toolchain /path-to/sysroot/ 下已经有一个适当的 etc.ld.so.conf等,但我仍然遇到链接问题。我需要将 etc.ld.so.conf 文件放在 /path-to/toolchain 的哪个位置?
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-07
      • 2012-05-17
      • 2013-01-03
      • 1970-01-01
      • 2023-01-07
      • 2013-09-09
      • 2011-07-16
      • 1970-01-01
      相关资源
      最近更新 更多