GCC中树莓派的交叉编译。 从哪儿开始?
TL / DR :我在哪里可以find关于为ARM(gnueabi)平台(旨在运行在Raspberry Pi设备上)构buildGCC 4.7.0交叉编译工具链的更多信息?
我刚刚有了一个全新的树莓派,我非常渴望为它开始编程。 我已经设法安装GCC工具链(我正在使用Arch Linux系统映像)并编译了一些基本程序,所有工作都正常。
我也试过编译Boost库,因为我经常在项目中使用它们,除了编译速度很慢之外,所有内容似乎都能正常工作( ./bootstrap.sh
+ ./b2
)。 我离开了几个小时,但几乎没有通过前几个源文件。 在我离开之后,我发现由于RAM短缺而中止了构build过程。
所以,我的猜测是,Rasp Pi在编译像Boost这样的大小的东西时是不够的。 所以,交叉编译出现在我的脑海里。 但是,尽pipe在线提供了大量有关ARM交叉编译的信息,但我发现它很混乱。 哪里开始?
我在Raspberry Pi上有一个最新的GCC版本(4.7.0),所以我希望能够用相同的版本进行交叉编译。 我在哪里可以获得ARM的GCC 4.7.0工具链? (我将在x86 CentOS 6.2上编译)
编辑:
我释放了不需要的GPU内存,并在USB驱动器上设置了4GB的交换分区,而构build文件位于NFS共享上。 Boost现在编译速度要快得多,所以可以pipe理。 我仍然想知道如何在x86 PC上build立一个GCC 4.7工具链进行交叉编译,因为我打算做大量的编译工作,我希望它尽可能快。
编辑2:
由于GCC 4.7.0是相对较新的,似乎没有预先build立的交叉编译器(i386-> ARM)。 我可能要自己build一个,这似乎是一个不平凡的任务(我已经尝试失败了)。 有谁知道一个教程要build立一个GCC交叉编译器,希望为最近的版本之一?
我已经尝试了这个很棒的shell脚本 (这对于构build一个相同的脚本编译器非常有效),并且我已经成功构build了binutils
和GCC的先决条件,但是GCC构build仍然失败,出现了许多隐藏的错误。 我真的迷失在这里,所以我非常感谢你的帮助。
GCC在Raspberry Pi上configuration了
--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:
我设法使用这个shell脚本为用户build议的ARM(yay!)build立一个4.7 GCC工具链。 我还使用这篇文章作为指导,构build了newlib
和libstdc++
。 工具链可以正常工作,但是如果我在Raspberry Pi上运行可执行文件,那么会导致Illegal instruction
失败。 这可能是什么原因?
我发现这些说明如何为您的树莓派build立一个交叉编译器 。 通过使用crosstool-ng
工具可以简化configuration交叉编译器构build一个LOT(它有一个很好的基于curses的接口),它支持GCC 4.7。
似乎很好的工作!
下面是一个分步指南如何在Windows中构buildRaspberry Pi交叉编译器 。 你得到Illegal Instruction
错误的原因是最新的Raspbian是hardfp启用,需要适当的补丁gcc和eglibc支持hardfp。 否则生成的代码将使用不同的ABI,即在不同的寄存器中传递函数参数,所以在运行时崩溃。
还错误地configuration了ARMv7的GCC(Raspebby Pi是ARMv6)可能会导致Illegal Instruction
错误。 在configurationGCC时一定要指定--with-arch=armv6
选项。
上面的链接是基于GCC 4.6.3。 但我想这也应该与GCC 4.7一起工作。
http://github.com/dwelch67/raspberrypi buildgcc目录有一个4.7 gcc / gnu和3.0 clang / llvm的脚本。 gnu一个来自mpc项目的脚本,在opencores中,我把gdb和libgcc,glibc等切成了一个编译器。 如果你想要其他的东西,剪切和粘贴胳膊ips。
我找不到4.7 gcc,只有4.6。 有关信息,我按照本页上的指导将Pi的内核编译到相当古老的Ubuntu机器上(1Ghz,768MB RAM): 内核编译
构build需要大约90分钟,相比之下,6小时,这是build议,它将采取丕。 内核在Pi上运行良好。 也许你可以修改这些指导原则来交叉编译x86 Linux机器上的其他项目。
你可以试试工具链: https : //github.com/kallaballa/Raspberry-GCC-4.7.3
这是一个使用gnueabi的armv6预制gcc-4.7.3工具链。 我正在使用它来交叉编译c ++ 11的raspberrian目标。
请注意,它只适用于Linux x86_64主机。
dockcross项目是完全除臭的工具链的一个很好的起点,你不仅可以为Pi创build,而且可以为其他任何东西创build。 这里是命令:
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
。
正如你所指出的,build立在Raspberry Pi本身上是缓慢的,但可靠的(因为它不是交叉编译),只要你没有用完内存。 也许有可能调整内存和交换设置,使更大的版本成为可能(如果不是很快)。 我知道在论坛上,人们正在讨论如何将根分区放在标清分区,USB驱动器上的用户分区上,当然,获得快速(6级以上)SD卡也许会有所帮助。 随着时间的推移,随着软件的改进,编译性能将会提高。 或者,也许树莓派2将有一个改进的芯片组和更多的内存。 🙂