关于c ++:GCC中Raspberry Pi的交叉编译。

Cross-compilation for Raspberry Pi in GCC. Where to start?

TL/DR: Where can I find more information about building a GCC 4.7.0 cross-compiling toolchain for ARM (gnueabi) platform (intended to run on a Raspberry Pi device)?

我刚买了一个全新的覆盆子圆周率,我非常渴望开始为它编程。我已经成功地安装了gcc工具链(我使用的是archLinux系统映像),并编译了一些基本程序,这些程序都运行良好。

我也试着编译Boost库,因为我经常在我的项目中使用它们,除了编译速度非常慢之外,通过遵循说明(./bootstrap.sh./b2),一切似乎都很好。我让它开了几个小时,但它几乎没有通过最初的几个源文件。在我让它运行了一晚之后,我发现由于RAM不足,构建过程中止了。

所以,我的猜测是,RASPPI对于编译诸如boost之类的大小的东西来说,只是动力不足。所以,我想到了交叉汇编。然而,尽管网上有很多关于ARM交叉编译的信息,我还是觉得很困惑。从哪里开始?

我的Raspberry PI上有一个最新的gcc版本(4.7.0),所以理想情况下我希望使用相同的版本进行交叉编译。在哪里可以获得用于ARM的GCC4.7.0工具链?(我将在x86 CentOS 6.2上编译)

编辑:

我释放了不需要的GPU内存,并在USB驱动器上设置了一个4GB交换分区,而构建文件在一个NFS共享上。Boost现在编译速度快得多,所以它是可管理的。不过,我还是想知道如何在我的x86 PC上建立一个用于交叉编译的GCC4.7工具链,因为我打算进行大量编译,我希望它尽可能快。

编辑2:

由于GCC4.7.0相对较新,所以似乎没有预构建的交叉编译器(i386->arm)。我可能要自己做一个,这似乎是一个不平凡的任务(我已经尝试过,但失败了)。有人知道构建GCC交叉编译器的教程吗,希望是最新版本的教程?

我试过使用这个很棒的shell脚本(它对于构建相同的arch编译器非常有用),并且我成功地构建了binutils和gcc的先决条件,但是gcc构建却一直失败,并出现许多神秘的错误。我真的迷路了,非常感谢你的帮助。

树莓pi上的gcc配置为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
--prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib
--mandir=/usr/share/man --infodir=/usr/share/info
--with-bugurl=https://bugs.archlinux.org/
--enable-languages=c,c++,fortran,lto,objc,obj-c++ --enable-shared
--enable-threads=posix --with-system-zlib --enable-__cxa_atexit
--disable-libunwind-exceptions --enable-clocale=gnu
--disable-libstdcxx-pch --enable-libstdcxx-time
--enable-gnu-unique-object --enable-linker-build-id --with-ppl
--enable-cloog-backend=isl --enable-lto --enable-gold
--enable-ld=default --enable-plugin --with-plugin-ld=ld.gold
--with-linker-hash-style=gnu --disable-multilib --disable-libssp
--disable-build-with-cxx --disable-build-poststage1-with-cxx
--enable-checking=release --host=arm-unknown-linux-gnueabi
--build=arm-unknown-linux-gnueabi

编辑3:

我设法为ARM构建了一个4.7 gcc工具链(yay!)使用用户dwelch在注释中建议的shell脚本。我还使用本文作为指南构建了newliblibstdc++。工具链工作得很好,但是当我在Raspberry PI上运行可执行文件时,它在Illegal instruction上失败了。这可能是什么原因?


我发现了这些说明如何为您的树莓pi构建一个交叉编译器。这是使用crosstool-ng工具的一个很好的演练,它简化了配置跨编译器构建的过程(它有一个很好的基于诅咒的接口),并支持GCC4.7。

看起来效果不错!


下面是如何在Windows中构建Raspberry PI交叉编译器的分步指南。您得到Illegal Instruction错误的原因是最新的raspbian启用了hardfp,并且需要gcc和eglibc的适当补丁来支持hardfp。否则生成的代码将使用不同的ABI,即在不同的寄存器中传递函数参数,因此在运行时崩溃。

同样,错误配置armv7的gcc(raspebby pi是armv6)也可能导致Illegal Instruction错误。配置GCC时,一定要指定--with-arch=armv6选项。

以上链接的指南基于GCC 4.6.3。但我想它也应该适用于GCC4.7。


http://github.com/dwelch67/raspberrypi buildgcc目录有一个用于4.7 gcc/gnu和3.0 clang/llvm的脚本。GNUone是从OpenCores的MPX项目的脚本派生而来的,我去掉了gdb和libgcc、glibc等,并把它放到了一个编译器中。如果你想要其他的东西,为mips剪切和粘贴手臂。


我找不到4.7 gcc,只有4.6。为了获取信息,我在一台相当老的Ubuntu机器(1GHZ,768MB RAM)上按照本页的指南编译了PI的内核:编译内核的方法

建造花费了大约90分钟,与6小时相比,建议它将花费在PI上。内核在pi上运行良好。也许您可以修改这些准则,以便在x86 Linux机器上交叉编译其他项目。


DockCross项目是完全除臭的工具链的一个很好的起点,您不仅可以为PI构建,还可以为其他任何东西构建。以下是命令:

1
2
3
docker run --rm dockcross/linux-armv7 > ./dockcross-linux-armv7
chmod +x ./dockcross-linux-armv7
./dockcross-linux-armv7 bash -c '$CC test/C/hello.c -o hello_arm'

它也内置了EDOCX1[4]。


您可以尝试使用raspberry-gcc-4.7.3工具链。

它是一个预先构建的GCC-4.7.3工具链,用于使用gnueabi的带有hardfp的ARMV6。我用它来交叉编译C++ 11的RasbReRIAN目标。

请注意,它只在Linux x86_64主机上工作。


型您可以在此最新的Github存储库中尝试我的开源预编译/预编译GCC Cross&native Compiler Binaries for Raspberry PI:

此项目包含最新的预编译/预构建的Raspberry PI GCC Cross&native编译器二进制文件集,可节省大量时间(不需要任何编译或错误处理)。只需提取、链接和享受机器中的完整gcc(覆盆子PI)功能即可。您可以使用Raspberry PI的本机编译器(可以与旧的&slow 6.3.0 gcc一起使用),或者在任何Linux机器上使用交叉编译器(在最新的Ubuntu/Bionic X64上测试)来为您的Raspberry PI编译程序。所有这些编译器二进制文件都是Raspberry PI硬件,经过优化以提高整体性能。

支持的GCC版本:

    百万千克1一般合同条款第6.3.0款百万千克1百万千克1一般合同条款第7.4.0款百万千克1百万千克1一般合同条款第8.2.0款百万千克1百万千克1一般合同条款第8.3.0款百万千克1

支持覆盆子PIS:

    百万千克1当前支持所有Raspberry PI版本/模型。百万千克1百万千克1任何其他具有类似硬件配置的ARM设备也可以工作。百万千克1

支持的环境:

    百万千克1交叉编译器:当前支持所有Linux发行版(x32/x64)。百万千克1百万千克1本机编译器:支持所有带有Raspbian操作系统的Raspberry PI版本/模型。其他操作系统可能/可能不工作。百万千克1

支持的语言:

    百万千克1C++百万千克1百万千克1C百万千克1百万千克1福特兰百万千克1


正如您所注意到的,在Raspberry PI上构建本身是缓慢的,但是是可靠的(因为它不是交叉编译的),前提是您没有耗尽内存。也许可以调整内存并交换设置以使更大的构建成为可能(如果不是很快的话)。我知道在论坛上,人们谈论的是在sd上放置根分区,在usb驱动器上放置用户分区,当然,获得一张快速(6级或更高级别)的sd卡可能会有所不同。随着时间的推移,编译性能可能会随着软件的改进而提高。或者,也许覆盆子Pi2将有一个改进的芯片组和更多的RAM。:-)