我正在使用 gcc 在我的 CI 服务器上编译一个 C++ 应用程序(http://ci.berboe.co.uk) 并且由于它编译的 vps 具有 x86-64 架构,所以我需要交叉编译才能使编译后的程序在 x86 计算机上运行。
我已经安装了 gcc-multilib 和 g++-multilib 以及其他地方建议的几个其他软件包,但在尝试编译时仍然收到错误。它是:
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.5/libstdc++.so when searching for -lstdc++
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.5/libstdc++.a when searching for -lstdc++
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.5/libstdc++.so when searching for -lstdc++
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.5/libstdc++.a when searching for -lstdc++
/usr/bin/ld: cannot find -lstdc++
collect2: ld returned 1 exit status
完整日志可在此处查看:http://ci.berboe.co.uk/job/MCServer%20Linux-x86/11/console
如能得到任何帮助以解决该问题,我们将非常感激。
编辑:
/usr/bin/ld: i386:x86-64 architecture of input file `/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crt1.o' is incompatible with i386 output
/usr/bin/ld: i386:x86-64 architecture of input file `/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crti.o' is incompatible with i386 output
/usr/bin/ld: i386:x86-64 architecture of input file `/usr/lib/gcc/x86_64-linux-gnu/4.4.5/crtbegin.o' is incompatible with i386 output
/usr/bin/ld: i386:x86-64 architecture of input file `/usr/lib/gcc/x86_64-linux-gnu/4.4.5/crtend.o' is incompatible with i386 output
/usr/bin/ld: i386:x86-64 architecture of input file `/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crtn.o' is incompatible with i386 output
/usr/bin/ld: final link failed: Invalid operation
在解决了之前的问题后我得到了这个。
答案1
- 安装 32 位库(
ia32-libs
在某些发行版中,移动到此处:http://wiki.debian.org/Multiarch/HOWTO在其他方面,如果你要求的话,可以了解更多信息)。 - 确保将 i386 库路径添加到您的
LD_LIBRARY_PATH
环境变量中。(肯定export LD_LIBRARY_PATH = ${LD_LIBRARY_PATH}:/lib32:/usr/lib32:/usr/lib/i386-linux-gnu
是这样的)。 - 确保将 i386 包含路径添加到
LD_INCLUDE_PATH
环境变量中。
请随意查找这些库(当然,一旦安装),使用:
find / -iname "*libstdc++.so*" 2> /dev/null
例如对于libstdc++.so
库。find
应该报告一些您可以添加到LD_LIBRARY_PATH
环境变量的路径。
答案2
有两种选择可能工作:
- 通过运行安装
ia32-libs
包sudo apt-get install ia32-libs
。这只是一种预感,它可能有效,也可能无效。 - 另一个解决方案是在虚拟机上安装 32 位 Linux 来编译代码。
此链接可能有帮助:-http://en.sfml-dev.org/forums/index.php?topic=6034.0
答案3
您最好制作一个 i386 chroot。 mk-sbuild
(在 ubuntu-dev-tools 中)并使schroot
这些非常容易管理。