51

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 上编译)

编辑:

我释放了不需要的 GPU 内存并在 USB 驱动器上设置了一个 4GB 交换分区,而构建文件位于 NFS 共享上。Boost 现在的编译速度要快得多,因此它是易于管理的。我仍然想知道如何在我的 x86 PC 上设置用于交叉编译的 GCC 4.7 工具链,因为我打算进行大量编译并且我希望它尽可能快。

编辑2:

由于 GCC 4.7.0 相对较新,似乎没有预构建的交叉编译器(i386->ARM)。我可能不得不自己建造一个,这似乎是一项不平凡的任务(我已经尝试过但失败了)。有谁知道构建 GCC 交叉编译器的教程,希望是最新版本之一?

我已经尝试过使用这个很棒的 shell 脚本(它非常适合构建相同架构的编译器)并且我已经成功构建了binutilsGCC 的先决条件,但是随后 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 

编辑3:

按照用户 dwelch 在评论中的建议,我设法使用这个 shell 脚本为 ARM 构建了一个 4.7 GCC 工具链(耶!)。我还构建newliblibstdc++使用这篇文章作为指南。工具链工作正常,但是当我在 Raspberry Pi 上运行可执行文件时,它会以Illegal instruction. 这可能是什么原因?

4

8 回答 8

25

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

似乎工作得很好!

于 2012-06-13T14:48:44.573 回答
4

http://github.com/dwelch67/raspberrypi buildgcc 目录有 4.7 gcc/gnu 和 3.0 clang/llvm 的脚本。gnu 一源自 opencores 的 mpx 项目中的脚本,我删除了 gdb 和 libgcc、glibc 等,将其归为编译器。如果你想要其他东西剪切和粘贴 mips 的手臂。

于 2012-06-13T15:01:29.257 回答
4

以下是如何在 Windows 中构建 Raspberry Pi 交叉编译器的分步指南。您收到Illegal Instruction错误的原因是最新的 Raspbian 启用了 hardfp,并且需要为 gcc 和 eglibc 提供适当的补丁来支持 hardfp。否则生成的代码将使用不同的 ABI,即在不同的寄存器中传递函数参数,因此在运行时崩溃。

此外,为 ARMv7(Raspebby Pi 是 ARMv6)错误配置 GCC 可能会导致Illegal Instruction错误。请务必--with-arch=armv6在配置 GCC 时指定选项。

上面链接的指南虽然基于 GCC 4.6.3。但我想它也应该适用于 GCC 4.7。

于 2012-09-26T08:05:02.657 回答
2

我找不到 4.7 gcc,只有 4.6。有关信息,我按照此页面上的指南在相当旧的 Ubuntu 机器(1Ghz,768MB RAM)上编译了 Pi 的内核: 内核编译

构建大约需要 90 分钟,而在 Pi 上建议需要 6 小时。内核在 Pi 上运行良好。也许您可以调整这些指南,以便在您的 x86 Linux 机器上交叉编译其他项目。

于 2012-06-12T09:52:50.570 回答
2

您可以从这个最新的GitHub 存储库中尝试我的开源预构建/预编译 GCC Cross & Native Compiler Binaries for Raspberry Pi :

该项目包含 UpToDate 预编译/预构建的 Raspberry pi GCC 交叉和本机编译器二进制文件集,可节省大量时间(无需编译或错误处理)。只需在您的机器中提取、链接和享受完整的 GCC(Raspberry Pi)功能。您可以将其原生编译器用于 Raspberry Pi(可与旧的和慢速 6.3.0 GCC 一起使用),或者在任何 Linux 机器上使用交叉编译器(在最新的 Ubuntu/bionic x64 上测试)为您的 Raspberry Pi 编译程序. 所有这些编译器二进制文件都是为增强整体性能而优化的 Raspberry Pi 硬件。

支持的 GCC 版本:

  • 海合会 6.3.0
  • 海合会 7.4.0
  • 海合会 8.2.0
  • 海合会 8.3.0

支持的树莓派:

  • 当前支持所有 Raspberry Pi 版本/型号。
  • 任何其他具有类似硬件配置的 ARM 设备也可以工作。

支持的环境:

  • 交叉编译器:当前支持所有 Linux 发行版 (x32/x64)。
  • Native-Compiler:支持所有带有 Raspbian OS 的 Raspberry Pi 版本/型号。其他操作系统可能/可能不工作。

支持的语言:

  • C++
  • C
  • Fortran
于 2019-03-06T06:09:46.197 回答
1

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

这是一个使用 gnueabi 的带有 hardfp 的 armv6 的预构建 gcc-4.7.3 工具链。我正在使用它为树莓派目标交叉编译 c++11。

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

于 2012-12-21T12:01:17.483 回答
1

Dockcross 项目是完全除臭工具链的一个很好的起点,您不仅可以为 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内置了。

于 2017-04-14T18:50:53.147 回答
0

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

于 2012-07-02T17:41:35.880 回答