【问题标题】:How can I change the libraries that gcc uses when linking with /bin/ld?如何更改 gcc 在与 /bin/ld 链接时使用的库?
【发布时间】:2013-02-01 17:33:26
【问题描述】:

我正在尝试使用从另一个系统重新定位的 gcc 版本来编译某些东西。我知道这有问题,但如果我能让它工作,它会让我的生活更轻松。我已将 /opt/transfer/lib 路径添加到 $LIBRARY_PATH 并且 gcc 似乎看到了这一点(来自 gcc -print-search-dirs)。我还添加了 /opt/transfer/lib 到 /etc/ld.so.conf 虽然我非常喜欢不需要这样做的解决方案。当我执行时问题来了:

g++ -g -m32 chopper.o -Llibs -lRTS -o Chopper /usr/bin/ld: 跳过 搜索时不兼容的 /usr/lib/libstdc++.so.6 /usr/lib/libstdc++.so.6 /usr/bin/ld: 找不到 /usr/lib/libstdc++.so.6 /usr/bin/ld: 跳过不兼容 /lib/libc.so.6 搜索 /lib/libc.so.6 /usr/bin/ld 时:不能 查找 /lib/libc.so.6 /usr/bin/ld: 跳过不兼容 /usr/lib/libc_nonshared.a 搜索 /usr/lib/libc_nonshared.a 时 /usr/bin/ld: 找不到 /usr/lib/libc_nonshared.a collect2: ld 返回 1 个退出状态

ld 似乎正在 /usr/lib/ 中搜索然后放弃。有一个 /opt/transfer/lib/libstdc++.so.6 文件应该兼容但没有被链接到。如果我运行“gcc -print-file-name=libstdc++.so.6”,它会找到我希望它使用的版本。在这种情况下,有什么方法可以强制 ld 在另一个目录中而不是 /usr/lib 中查找?

编辑

我尝试按照 nneonneo 的建议使用 --sysroot 选项,但我不确定它是否有效。这个选项在我的 ld 版本中不可用,所以我使用 --with-sysroot=/opt/transfer 和 --with-build-sysroot=/opt/transfer 重新编译。然后,当我运行时,我将其作为示例输出:

/opt/transfer/bin/ld:跳过不兼容的/usr/lib/libstdc++.so.6 搜索 /usr/lib/libstdc++.so.6 时 /opt/transfer/bin/ld: 找不到 /usr/lib/libstdc++.so.6 ld 返回 1 个退出状态

从这个输出中,我不是 100% 清楚它正在搜索 /opt/transfer/lib 和 /opt/transfer/usr/lib 目录,因为我相当确定正确的 libstdc++.so.6 文件应该在那里。如果我从 /opt/transfer 中删除这些库,那么它会开始抱怨缺少其他库,因此它显然至少可以部分工作,但是所有这些其他库都只说找不到它们,而对于 libstdc++ 它仍然说它正在跳过一个不兼容的库. libstdc++ 是否有可能被视为特例?是否有其他选项可以解决此问题?

编辑 2

我刚刚将系统的 /usr/libstdc++.so.6 移动到备份位置,并且在这样做之后 ld 将不再说它正在跳过不兼容的版本。这绝对意味着 --sysroot 没有做我在这里所期望的。任何人所拥有的任何更多信息都将非常感激。

【问题讨论】:

  • 有趣。尝试将-lstdc++ 显式添加到命令行。您是直接拨打ld,还是直接拨打g++
  • 我正在使用 g++。添加 -lstdc++ 选项不会更改输出。

标签: linux gcc libraries ld search-path


【解决方案1】:

尝试使用--sysroot 选项 (--sysroot /opt/transfer)。 --sysroot 是让 GCC(和相关工具)从非标准目录运行的推荐方法,因此它非常适合您重新定位的 GCC。

您将不得不重新组织您的 /opt/transfer 目录以更紧密地匹配源代码分发的布局(即将库放在 /opt/transfer/usr/lib 下)。您可以根据需要将 GCC 需要的任何内容从常规目录符号链接到 /opt/transfer

【讨论】:

  • 感谢您向我指出该选项,这非常有帮助。我不确定它是否完全按照我的意愿工作。我在尝试此操作时会发生什么的问题中添加了更多信息。再次感谢!
猜你喜欢
  • 2012-04-18
  • 2017-10-19
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 2011-04-09
相关资源
最近更新 更多