GCC中树莓派的交叉编译。从哪儿开始?

问题描述:

TL/DR:我在哪里可以找到关于为ARM(gnueabi)平台(打算在Raspberry Pi设备上运行)构建GCC 4.7.0交叉编译工具链的更多信息?GCC中树莓派的交叉编译。从哪儿开始?

我刚买了一个全新的树莓派,我非常渴望为它开始编程。我设法安装了GCC工具链(我正在使用Arch Linux系统映像)并编译了一些基本程序,所有工作都很好。

我也试过编译Boost库,因为我经常在我的项目中使用它们,并且按照说明(./bootstrap.sh + ./b2)似乎一切正常,除了编译速度很慢。我将它搁置了几个小时,但几乎没有超过前几个源文件。在我离开它运行了一晚之后,我发现由于RAM短缺而中止了构建过程。

所以,我的猜测是,Rasp Pi只是编译一些像Boost这样大小的东西。所以,我认为是交叉编译。但是,尽管在线提供了大量有关ARM交叉编译的信息,但我觉得它很让人困惑。哪里开始?

我在Raspberry Pi上有一个最新的GCC版本(4.7.0),所以我希望能够使用相同的版本进行交叉编译。我在哪里可以获得ARM的GCC 4.7.0工具链? (我将在x86的CentOS 6.2被编译)

编辑:

我不需要释放GPU内存,并设置了一个USB驱动器上的一个4GB的交换分区,同时建立文件上NFS共享。 Boost现在编译的速度要快得多,因此它是可管理的。我仍然想知道如何在x86 PC上建立一个GCC 4.7工具链来进行交叉编译,因为我打算做大量的编译工作,并希望它尽可能快。

编辑2:

由于GCC 4.7.0是相对较新的,似乎没有成为一个预先建立的交叉编译器(i386-> ARM)。我可能必须自己创建一个,这似乎是一项不重要的任务(我已经尝试并失败了)。有没有人知道一个教程要建立一个GCC交叉编译器,希望为最近的版本之一?

我试着this great shell script(这对于建立一个相同的拱编译伟大的工作),我已经成功地建立binutils和GCC的先决条件,但随后GCC编译保持着许多神秘的错误失败。我真的迷失在这里,所以我会非常感谢你的帮助。上树莓裨

GCC用

--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配置:

我设法建立使用this shell script为ARM 4.7 GCC工具链(耶!)通过在用户dwelch所建议注释。我还使用this article作为指导,建立了newliblibstdc++。工具链可以正常工作,但是如果我在Raspberry Pi上运行可执行文件,它会以Illegal instruction失败。这可能是什么原因?

+1

尝试zram包,如果它尚未安装。这将创建一个压缩的RAM交换,这比你想象的更有帮助。 (太奇怪了。)还要添加一个非常快速的USB设备,无论是美元硬盘还是高质量的USB棒,并把交换。 –

+3

此外,在这个线程,你可以阅读如何禁用图形内存,所以你获得32兆内存:http://www.raspberrypi.org/phpBB3/viewtopic.php?f=5&t=4831&p=65410 –

+1

哇,谢谢。我实际上已经为GPU分配了128MB。难怪一切都如此缓慢。 – Tibor

我找不到4.7 gcc,只有4.6。有关信息,我整理了郫县的内核相当老的Ubuntu机(1GHz的768MB RAM)以下此页面上的准则: Kernel compilation

构建了约90分钟,而到6分,这是建议,将采取Pi。内核在Pi上运行良好。也许你可以修改这些指导原则来交叉编译x86 Linux机器上的其他项目。

我发现这些说明How to build a cross compiler for your Raspberry Pi。使用crosstool-ng工具可以简化配置交叉编译器构建一个LOT(它有一个很好的基于curses的接口)并且它支持GCC 4.7。

似乎很好!

http://github.com/dwelch67/raspberrypibuildgcc directory有一个4.7 gcc/gnu和3.0 clang/llvm的脚本。从opencores的mpx项目的脚本中得到的gnu,我删掉了gdb和libgcc,glibc等,把它放到了编译器中。如果你想要其他的东西剪切和粘贴胳膊mips。

正如你所指出的,建立在Raspberry Pi本身上是缓慢的,但可靠的(因为它不是交叉编译),只要你没有耗尽内存。也许可以调整内存和交换设置,使更大的版本成为可能(如果不是很快)。我在论坛上了解到,人们正在讨论将根分区放在标清,USB驱动器上的用户分区上,当然,获得快速(6级或更高级别)SD卡可能会有所帮助。随着时间的推移,随着软件的改进,编译性能可能会提高。或者,也许树莓派2将有一个改进的芯片组和更多的内存。 :-)

+0

谢谢你的建议,但30分钟的RPi与1分钟我的笔记本电脑使得它在发展中非常不切实际,因为我有很多重建工作要做。如果差异不那么激烈,我肯定会在设备上构建。 – Tibor

+0

是的,我在同一条船上,在RPi上建造大约30分钟。我将在Linux中开发(实际上是在Mac OS X上的Ubuntu VM),然后当我想对它进行测试时,就可以在RPi上进行构建。我希望这足以满足我的目的(这是一个合理的设置),但如果没有,我也会进行交叉编译。 – mlepage

+0

我不知道我的Pi是不同的,但我从2012年开始有一个。它超频到1000MHz。然而,它能够编译我最大的程序〜10K行的实际代码(不是评论等)。取决于我是否删除所有输出对象,我的编译时间大约为30s到3分钟。 我很少得到GCC段错误。但是,在编译时间内调试和更改代码真的很麻烦! 我用Ubuntu调试我的笔记本电脑上的所有程序,然后编译它们为Pi!完美的作品! – yash101

以下是一步一步的指导How to build Raspberry Pi cross-compiler in Windows。您得到Illegal Instruction错误的原因是最新的Raspbian已启用hardfp,并且需要gcc和eglibc的相应补丁才能支持hardfp。否则,生成的代码将使用不同的ABI,即不同的寄存器中的传递函数参数,因此会在运行时崩溃。

也错误配置GCC for ARMv7(Raspebby Pi是ARMv6)可能会导致Illegal Instruction错误。在配置GCC时一定要指定--with-arch=armv6选项。

上面链接的指南基于GCC 4.6.3。但我想它也适用于GCC 4.7。

你可以尝试工具链在:https://github.com/kallaballa/Raspberry-GCC-4.7.3

这是一个预构建GCC-4.7.3工具链使用gnueabi hardfp ARMv6的。我正在使用它来为一个raspberrian目标交叉编译C++ 11。

请注意,它只适用于Linux x86_64主机。

dockcross project是完全除臭工具链的一个很好的起点,你不仅可以为Pi创建,而且可以为其他任何东西创建。这里是命令:

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' 

它也有内置的cmake