【发布时间】: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