1

我正在尝试使用从另一个系统重新定位的 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/ 时跳过不兼容的 /usr/lib/libstdc++.so.6 bin/ld: 找不到 /usr/lib/libstdc++.so.6 /usr/bin/ld: 搜索 /lib/libc.so.6 /usr/bin/ld 时跳过不兼容的 /lib/libc.so.6 : 找不到 /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 没有做我在这里所期望的。任何人拥有的任何更多信息将不胜感激。

4

1 回答 1

3

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

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

于 2013-02-17T00:39:30.427 回答