首页 文章

GCC中Raspberry Pi的交叉编译 . 从哪儿开始?

提问于
浏览
52

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作为指南构建了 newliblibstdc++ . 工具链工作正常,但是我在我的Raspberry Pi上运行可执行文件,它失败了 Illegal instruction . 可能是什么原因?

7 回答

  • 4

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

    好像很棒!

  • 1

    这是一个分步指南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 .

  • 24

    http://github.com/dwelch67/raspberrypi buildgcc directory有一个4.7 gcc / gnu和3.0 clang / llvm的脚本 . gnu是从opencores的mpx项目的脚本派生出来的,我剪掉了gdb和libgcc,glibc等把它带到了编译器 . 如果你想要其他的东西切割和粘贴手臂的mips .

  • 4

    根据本页面的指导原则,我无法在相当旧的Ubuntu机器(1Ghz,768MB RAM)上运行内核:Kernel compilation

    构建花费了大约90分钟,相比之下,建议它需要花费6个小时 . 内核在Pi上运行良好 . 也许您可以调整这些指南,以便在x86 Linux机器上交叉编译其他项目 .

  • 2

    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 .

  • 1

    您可以试试Raspberry-GCC-4.7.3工具链 .

    它是armv6的预制gcc-4.7.3工具链,带有使用gnueabi的hardfp . 我用它来交叉编译c 11以获得一个raspberrian目标 .

    请注意它只适用于linux x86_64主机 .

  • 0

    正如您所指出的那样,基于Raspberry Pi本身很慢,但是可靠(因为它不是交叉编译),前提是您没有内存不足 . 也许可以调整内存和交换设置以使更大的构建成为可能(如果不是很快) . 我知道在论坛上,人们都在谈论在SD驱动器上放置根分区,USB驱动器上的用户分区,当然,获得快速(6级或更高级别)SD卡可能会有所不同 . 随着时间的推移,随着软件的改进,编译性能将得到改善 . 或者,也许Raspberry Pi 2将拥有改进的芯片组和更多的RAM . :-)

相关问题