GCC中的树莓派交叉编译。如何开始?

51
TL/DR:我在哪里可以找到有关为ARM(gnueabi)平台构建GCC 4.7.0交叉编译工具链的更多信息(旨在在树莓派设备上运行)?
我刚刚得到了一台全新的树莓派,非常渴望开始为它编程。我已经成功安装了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工具链以进行交叉编译,因为我打算进行大量编译,希望它尽可能地快。
第二次编辑:
由于GCC 4.7.0相对较新,似乎没有预构建的交叉编译器(i386-> ARM)。我可能需要自己构建一个,这似乎是一个比较复杂的任务(我尝试过并失败了)。是否有人知道一个教程可以跟随构建GCC交叉编译器,最好是针对最新版本之一?
我尝试过使用这个很棒的shell脚本(用于构建相同架构的编译器非常成功),并且已经成功构建了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:

我成功地使用用户dwelch在评论中建议的此shell脚本构建了一个针对ARM的4.7 GCC工具链(耶!)。 我还使用这篇文章作为指南构建了newliblibstdc++。 工具链运行良好,但是当我在我的Raspberry Pi上运行可执行文件时,它会失败并显示非法指令。可能的原因是什么?


1
如果尚未安装,请尝试使用zram软件包。这将创建一个压缩的RAM交换空间,其效果比您想象的要好。(奇怪的是。)此外,添加一个相当快速的USB设备,可以是USB硬盘驱动器或高质量的USB闪存驱动器,并将交换空间放在其中。 - Prof. Falken
3
在这个帖子中,你可以阅读如何禁用图形内存以获得32MB的RAM:http://www.raspberrypi.org/phpBB3/viewtopic.php?f=5&t=4831&p=65410。 - Prof. Falken
1
哇,谢谢。我实际上为GPU分配了128MB。难怪一切都如此缓慢。 - user267885
1
还可以尝试使用zram,它真的很棒。对于拥有800MHz预Atom(旧款Celeron-M)CPU和512兆内存的EeePC701来说,这将产生巨大的影响。 - Prof. Falken
可能是安装树莓派交叉编译器的重复问题。 - Ciro Santilli OurBigBook.com
显示剩余3条评论
8个回答

25
我找到了这些指南如何为您的树莓派构建交叉编译器。它是一个很好的步骤,使用crosstool-ng工具简化了交叉编译器的配置(它有一个漂亮的基于curses的界面),并且支持GCC 4.7。
看起来非常不错!

4
http://github.com/dwelch67/raspberrypibuildgcc目录中,有一个脚本可以编译4.7版本的gcc/gnu和3.0版本的clang/llvm。gnu版本基于opencores项目中mpx脚本,我删去了gdb、libgcc、glibc等内容,只保留了编译器。如果需要其他内容,请将arm替换为mips后复制粘贴即可。

4
这里有一份逐步指南如何在Windows中构建Raspberry Pi交叉编译器。您之所以会收到“非法指令”错误,是因为最新的Raspbian启用了hardfp,并需要适当的补丁来支持gcc和eglibc以支持hardfp。否则,生成的代码将使用不同的ABI,即在不同的寄存器中传递函数参数,导致运行时崩溃。
此外,将GCC配置为ARMv7(Raspebby Pi为ARMv6)可能会导致“非法指令”错误。确保在配置GCC时指定--with-arch=armv6选项。
上面链接的指南基于GCC 4.6.3。但我想它也应该适用于GCC 4.7。

2
我找不到4.7版本的gcc,只有4.6版本。值得一提的是,我在一台相当老的Ubuntu机器上编译了树莓派的内核(1Ghz, 768MB RAM),遵循了这个页面上的指南:Kernel compilation
整个编译过程大约花费了90分钟,而根据建议,在树莓派上编译可能需要6个小时。内核在树莓派上运行良好。也许你可以根据这些指南在你的x86 Linux机器上交叉编译其他项目。

2
你可以尝试使用我开源的预编译GCC交叉编译器和本地编译器二进制文件,从这个最新的GitHub存储库中获取树莓派:GitHub存储库
该项目包含了最新的一组预编译/预构建的Raspberry Pi GCC交叉编译器和本地编译器二进制文件,节省了大量时间(完全不需要编译或错误处理)。只需解压缩、链接并在您的机器上享受完整的GCC(Raspberry Pi)功能。您可以使用其本地编译器为Raspberry Pi编译程序(可与旧版和慢速6.3.0 GCC一起使用),或者在任何Linux机器上使用交叉编译器为您的Raspberry Pi编译程序(已在最新的Ubuntu/bionic x64上测试)。所有这些编译器二进制文件都经过了优化,以提高树莓派硬件的整体性能。
支持的GCC版本:
- GCC 6.3.0 - GCC 7.4.0 - GCC 8.2.0 - GCC 8.3.0
支持的Raspberry Pis:
- 目前支持所有Raspberry Pi版本/型号。 - 具有类似硬件配置的其他ARM设备也可能有效。
支持的环境:
- 交叉编译器:目前支持所有Linux发行版(x32/x64)。 - 本地编译器:支持安装了Raspbian操作系统的所有Raspberry Pi版本/型号。其他操作系统可能有效也可能无效。
支持的语言:
- C++ - C - Fortran

1

你可以尝试使用 Raspberry-GCC-4.7.3 工具链。

它是一个预构建的 gcc-4.7.3 工具链,用于 armv6 硬浮点支持和 gnueabi。我正在使用它来交叉编译 c++11 到 raspberrian 目标。

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


1

dockcross项目是一个非常好的起点,用于构建完全去臭的工具链,你可以为树莓派以及其他任何设备构建。以下是命令:

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

0

正如你所指出的,使用树莓派本身构建是缓慢但可靠的(因为它不是交叉编译),只要不会耗尽内存。也许可以调整内存和交换设置,使更大的构建变得可能(尽管不快)。我知道人们在论坛上谈论将根分区放在SD卡上,将用户分区放在USB驱动器上,当然,使用快速(6级或更高)的SD卡可能会有所不同。随着软件的改进,编译性能可能会随时间而改善。或者,也许树莓派2会拥有改进的芯片组和更多的内存。:-)


谢谢您的建议,但是在树莓派上需要30分钟,而在我的笔记本电脑上只需要1分钟,这使得在开发中进行大量重建非常不切实际。如果差别不是那么明显,我肯定会在设备上进行构建。 - user267885
是的,我也有同感,在Raspberry Pi上需要大约30分钟的构建时间。我将在Linux中进行开发(实际上是在Mac OS X上的Ubuntu虚拟机中),然后只需在Raspberry Pi上进行构建以进行测试。我希望这对我的目的足够了(这是一个合理的设置),但如果不行,我也会进行交叉编译。 - mlepage
我不知道我的树莓派是否与众不同,但我有一台来自2012年的树莓派。它超频到1000MHz。然而,它能够编译我的最大程序,大约10k行实际代码(不包括注释等)。我得到的编译时间大约在30秒到3分钟之间,具体取决于是否删除所有输出对象。 我很少遇到GCC段错误。然而,使用这种编译时间进行调试和更改代码真的很麻烦! 我在我的Ubuntu笔记本电脑上调试所有程序,然后将它们编译到树莓派上!完美运行! - yash101

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接