TL / DR:在哪里可以找到有关为ARM(gnueabi)平台(旨在在Raspberry Pi设备上运行)构建GCC 4.7.0交叉编译工具链的更多信息?
我刚买了一个全新的Raspberry Pi,我非常渴望为它开始编程 . 我已经设法安装了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上编译)
Edit:
我释放了不需要的GPU内存并在USB驱动器上设置了4GB交换分区,而构建文件在NFS共享上 . Boost现在编译得更快,因此它是可管理的 . 我仍然想知道如何在我的x86 PC上设置GCC 4.7工具链进行交叉编译,因为我打算做很多编译,我希望它尽可能快 .
Edit 2:
由于GCC 4.7.0相对较新,似乎没有预先构建的交叉编译器(i386-> ARM) . 我可能不得不自己构建一个,这似乎是一个非常重要的任务(我已经尝试过并且失败了) . 有没有人知道要 Build GCC交叉编译器的教程,希望是最近的版本之一?
我已经尝试了this great shell script(它非常适合构建同一个arch编译器)并且我已经成功构建了 binutils
和GCC的先决条件,但随后GCC构建仍然失败了许多神秘错误 . 我真的迷失在这里,所以我非常感谢你的帮助 .
Raspberry Pi上的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
Edit 3:
我设法使用_1491309为ARM构建一个4.7 GCC工具链(yay!),如用户dwelch在评论中所建议的那样 . 我还使用this article作为指南构建了 newlib
和 libstdc++
. 工具链工作正常,但是我在我的Raspberry Pi上运行可执行文件,它失败了 Illegal instruction
. 可能是什么原因?
7 回答
我找到了这些说明How to build a cross compiler for your Raspberry Pi . 使用
crosstool-ng
工具可以简化配置交叉编译器构建A LOT(它有一个很好的基于curses的接口),它支持GCC 4.7 .好像很棒!
这是一个分步指南How to build Raspberry Pi cross-compiler in Windows . 你得到
Illegal Instruction
错误的原因是最新的Raspbian是hardfp启用的,需要适当的gcc和eglibc补丁来支持hardfp . 否则生成的代码将使用不同的ABI,即在不同的寄存器中传递函数参数,因此在运行时崩溃 .同样错误配置ARMv7的GCC(Raspebby Pi是ARMv6)可能会导致
Illegal Instruction
错误 . 配置GCC时,请务必指定--with-arch=armv6
选项 .上面链接的指南虽然基于GCC 4.6.3 . 但我想它也应该适用于GCC 4.7 .
http://github.com/dwelch67/raspberrypi buildgcc directory有一个4.7 gcc / gnu和3.0 clang / llvm的脚本 . gnu是从opencores的mpx项目的脚本派生出来的,我剪掉了gdb和libgcc,glibc等把它带到了编译器 . 如果你想要其他的东西切割和粘贴手臂的mips .
根据本页面的指导原则,我无法在相当旧的Ubuntu机器(1Ghz,768MB RAM)上运行内核:Kernel compilation
构建花费了大约90分钟,相比之下,建议它需要花费6个小时 . 内核在Pi上运行良好 . 也许您可以调整这些指南,以便在x86 Linux机器上交叉编译其他项目 .
dockcross project是一个完全除臭的工具链的一个很好的起点,你不仅可以为Pi而且还可以为其他任何东西构建 . 以下是命令:
它内置了
cmake
.您可以试试Raspberry-GCC-4.7.3工具链 .
它是armv6的预制gcc-4.7.3工具链,带有使用gnueabi的hardfp . 我用它来交叉编译c 11以获得一个raspberrian目标 .
请注意它只适用于linux x86_64主机 .
正如您所指出的那样,基于Raspberry Pi本身很慢,但是可靠(因为它不是交叉编译),前提是您没有内存不足 . 也许可以调整内存和交换设置以使更大的构建成为可能(如果不是很快) . 我知道在论坛上,人们都在谈论在SD驱动器上放置根分区,USB驱动器上的用户分区,当然,获得快速(6级或更高级别)SD卡可能会有所不同 . 随着时间的推移,随着软件的改进,编译性能将得到改善 . 或者,也许Raspberry Pi 2将拥有改进的芯片组和更多的RAM . :-)