我正在尝试为 ARM 构建交叉编译 gcc。这将更新现有的 gcc ARM 交叉编译器。构建运行良好,直到 libgcc1 成功构建后开始构建 libstdc++。
错误是:
<gcc-object-path>/./gcc/xgcc -shared-libgcc -B<gcc-object-path>/./gcc -nostdinc++ -L<gcc-object-path>/<target>/libstdc++-v3/src -L<gcc-object-path>/<target>/libstdc++-v3/src/.libs -L<gcc-object-path>/<target>/libstdc++-v3/libsupc++/.libs -B<sysroot>/<target>/bin/ -B<sysroot>/<target>/lib/ -isystem <sysroot>/<target>/include -isystem <sysroot>/<target>/sys-include --sysroot=<boot-strap-xgcc-sysroot> -x c++-header -nostdinc++ -g -Os -I<gcc-object-path>/<target>/libstdc++-v3/include/<target> -I<gcc-object-path>/<target>/libstdc++-v3/include -I<gcc-source-path>/libstdc++-v3/libsupc++ -O2 -g -std=gnu++0x <gcc-source-path>/libstdc++-v3/include/precompiled/stdc++.h \
-o <target>/bits/stdc++.h.gch/O2ggnu++0x.gch
<gcc-source-path>/libstdc++-v3/include/precompiled/stdc++.h:52:20: fatal error: ccomplex: No such file or directory
#include <ccomplex>
^
compilation terminated.
find gcc-object-path -name ccomplex -print 显示:
<gcc-object-path>/<target>/libstdc++-v3/include/tr1/ccomplex
<gcc-object-path>/<target>/libstdc++-v3/include/ccomplex
编译命令有
-I<gcc-object-path>/<target>/libstdc++-v3/include
在上面。
<gcc-object-path>/<target>/libstdc++-v3/include/ccommon
是一个符号链接
<gcc-source-path>/libstdc++-v3/include/c_std/ccomplex
但该文件在该位置的源代码中不存在,因此它是一个损坏的符号链接,编译失败。不过,文件 ccomplex 确实存在于源树中的其他三个位置。还有 6 个其他此类符号链接也同样遭到破坏。
查看生成这些符号链接的 libstdc++-v3/include/Makefile,它希望在源树中的同一位置找到所有 c_base_headers 文件,但事实并非如此。这应该如何运作?
gcc 配置选项是:
gcc-${GCC_VERSION}/configure --target=$CONF_TARGET --prefix=${PREFIX} --exec_prefix=${PREFIX} --bindir=${PREFIX}/bin --sbindir=${PREFIX}/bin --libexecdir=${PREFIX}/libexec --datadir=${PREFIX}/share --sysconfdir=${PREFIX}/etc --sharedstatedir=${PREFIX}/share/com --localstatedir=${PREFIX}/var --libdir=${PREFIX}/lib --includedir=${PREFIX}/include --oldincludedir=${PREFIX}/include --infodir=${PREFIX}/share/info --mandir=${PREFIX}/share/man --enable-largefile --disable-nls --enable-ipv6 --with-gnu-ld --enable-shared --enable-languages=c,c++,objc,fortran --enable-threads=posix --disable-multilib --enable-c99 --enable-long-long --enable-symvers-gnu --enable-libstdcxx-pch --program-prefix=${CMD_PREFIX} --enable-target-optspace --enable-cheaders=c_std --disable-bootstrap --disable-libgomp --disable-libmudflap --with-float=soft --with-sysroot=${NEWSYSROOT} --with-build-sysroot=${SYSROOT} --with-build-time-tools=${INSTALLDIR}/${PREFIX}/${CONF_TARGET}/bin --disable-libunwind-exceptions --disable-libssp --enable-__cxa_atexit
答案1
您使用什么环境?您的目标环境是什么?
ARM 有一些工具链可供下载:ARM 开发者网站。
您可能需要为目标环境提供可用的库和头文件。对于 FreeBSD,这将是适当的 base.txz 文件,需要将其解压到正确的位置。
对于 386 和 amd64 FreeBSD v 11.* i,有适用于 ARM 的现有 GCC 交叉编译器。或者具体来说是arm64/aarch64。即使有艾达。这是在 /usr/ports/lang/gnatcross* 中找到的端口中。
如果你用谷歌搜索,应该很容易使用一些配置选项来编译通用的arm交叉编译器。很多人在编译交叉编译器时都以arm为例。
如果您有一个 ARM 或 aarch64 架构的 Raspberry PI,您可能会拥有很好的本机环境。然后您需要做的就是避免依赖操作系统的东西。
RPI 有多种可用的操作系统,包括:FreeBSD、Raspbian 以及其他 Linux 和 BSD 版本。
我正在为 aarch64 FreeBSD 12 交叉编译 GCC。它需要一些修改。于是我复制了涉及的端口并进行了修改。困难的一点是找出如何交叉编译 gcc。并找出需要禁用哪些选项。