交叉编译的树莓派在GCC。 从哪儿开始?(Cross-compilation for Raspb

2019-06-25 10:12发布

TL / DR:我在哪里可以找到关于建立更GCC 4.7.0的信息交叉编译工具链ARM(gnueabi)平台(意为树莓派设备上运行)?

我刚刚得到了一个全新的树莓派,我非常渴望开始编程吧。 我已经成功地安装GCC工具链(我用的是Arch Linux的系统映像),并整理了一些基本的程序,一切工作正常。

我也试着编译Boost库,因为我经常在我的项目中使用它们,一切似乎按照下列指示(以做工精细./bootstrap.sh + ./b2除了事实汇编是痛苦的缓慢)。 我把它上了几个小时,但它几乎没有得到过前几个源文件。 我离开它运行了一夜后,我发现,在构建过程中止由于RAM不足。

所以,我的猜测是,锉Pi为编写这样大小的东西作为加速只需动力不足。 因此,交叉编译在我脑海中。 然而,尽管有一个关于获得ARM交叉编译网上,我发现这混乱的大量信息。 该从何甚至开始?

我有最新的版本的GCC(4.7.0),可在我的树莓派,所以我非常喜欢使用相同版本的交叉编译。 我在哪里可以得到GCC 4.7.0工具链为ARM? (我将在x86的CentOS 6.2被编译)

编辑:

我不需要释放GPU内存,并成立了4GB的交换分区USB驱动器上,而构建文件在NFS共享。 升压现正整理多快很多,所以它是可管理的。 我还是想知道我怎么能建立一个GCC 4.7工具链的交叉编译我的x86 PC上虽然,因为我打算做了很多编译,我想它是尽可能快。

编辑2:

由于GCC 4.7.0是比较新的,似乎没有成为一个预先建立的交叉编译器(i386-> ARM)。 我可能要建立一个自己,这似乎是一个不平凡的任务(我已经尝试和失败)。 有谁知道一个教程遵循为构建GCC交叉编译器,希望能为近期版本中的一个?

我试着用这个伟大的shell脚本 (这对于建设一个同样的拱编译伟大的工作),我已经成功地建立binutils和海湾合作委员会的先决条件,但随后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:

我设法通过建立一个4.7 GCC工具链ARM(耶!) 这个shell脚本通过在注释用户dwelch的建议。 我还内置newliblibstdc++使用这篇文章作为指导。 该工具链工作正常,但母鸡我在我的树莓派运行可执行文件时,出现Illegal instruction 。 可能是什么的原因是什么?

Answer 1:

我发现这些指令如何建立一个交叉编译器,您的树莓派 。 它是通过使用一个大的步行路程crosstool-ng工具,它简化了配置交叉编译器建立了很多(它有一个基于诅咒漂亮的界面),它支持GCC 4.7。

似乎工作太棒了!



Answer 2:

这里是一步一步的指导如何建立树莓派交叉编译器在Windows 。 你得到的原因Illegal Instruction错误是最新的Raspbian是启用hardfp和需要gcc和eglibc相应的补丁程序,以支持hardfp。 否则生成的代码将在运行时使用不同的ABI,在不同的寄存器即通函数参数,所以崩溃。

也错误配置GCC对ARMv7(Raspebby Pi为ARMv6的)可以导致Illegal Instruction错误。 一定要指定--with-arch=armv6配置GCC时选项。

以上链接的指南是基于GCC 4.6.3虽然。 但我想它应该与GCC 4.7工作过。



Answer 3:

http://github.com/dwelch67/raspberrypi buildgcc目录有4.7 GCC / GNU和3.0铛/ LLVM两者的脚本。 GNU一个从在OpenCores的为MPX项目脚本导出,我切出GDB和libgcc中,glibc的,等把它归结为一个编译器。 如果你想为MIPS其他的东西剪切和粘贴手臂。



Answer 4:

我无法找到一个4.7 GCC,只有4.6。 有关信息,我整理了郫县的内核下面这个页面上的指引相当老的Ubuntu机(1GHz的768MB RAM)上: 编译内核

构建了约90分钟,而6分,这是暗示,它将采取的皮。 内核运行在皮细。 也许你能适应在您的x86 Linux机器交叉编译其他项目这些准则。



Answer 5:

该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内置为好。



Answer 6:

你可以尝试覆盆子GCC-4.7.3工具链。

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

请注意,它只能在Linux x86_64的主机。



Answer 7:

正如您所指出的,建立在树莓派本身是缓慢的,但可靠的(因为它不是交叉编译),只要你不耗尽内存。 也许有可能调整的内存和交换的设置做出了较大的建立可能的(如果不是快)。 我知道,在论坛上,人们都在谈论穿着SD根分区,用户划分的USB驱动器上,当然它可能会有所作为得到快速(6级或更高)的SD卡。 这是可能的,随着时间的推移,该编译性能将提高作为软件改进。 或者,也许树莓派2将具有改进的芯片组和更大的内存。 :-)



Answer 8:

您可以尝试为树莓派我的开源预建/预编译的GCC交叉与本地编译器的二进制文件,从这个上最新的GitHub库 :

这个项目包含了一套UpToDate的预编译/预建树莓派GCC交叉及本机编译的二进制文件,节省您的大量时间(任何不需要编译或错误处理)。 只需提取,链接和你的机器享受完整的海湾合作委员会(树莓派)的功能。 您可以使用其本地编译器为树莓派(可与老&慢6.3.0 GCC一起使用),或者使用交叉编译器在任何Linux机器(测试最新的Ubuntu /仿生x64)的编译程序,为您的树莓派。 所有这些编译二进制文件树莓派的硬件增强的整体性能进行了优化。

支持的GCC版本:

  • GCC 6.3.0
  • GCC 7.4.0
  • GCC 8.2.0
  • GCC 8.3.0

支持树莓派:

  • 目前支持所有树莓派版本/型号。
  • 具有类似硬件配置的任何其它ARM的设备也可以正常工作。

支持的环境:

  • 交叉编译:所有的Linux发行版(X32 / X64),目前支持。
  • 本地编译器:与Raspbian OS所有树莓派版/模型支持。 其他操作系统可能/可能-无法正常工作。

支持的语言:

  • C ++
  • C
  • Fortran语言


文章来源: Cross-compilation for Raspberry Pi in GCC. Where to start?