如何建立用于交叉编译的GCC 4.7工具链?


82

我已经在Stack Overflow上问过这个问题,但我想知道是否有人设法为ARM交叉编译(对于x86 / x86-64 Linux主机)构建了GCC 4.7工具链。关于从源代码构建GCC的说明很多,对于4.7之前的GCC版本,有很多可用的交叉编译器,而不仅仅是最新的版本。

在Rasp Pi本身上编译可以很好地工作,但是对于实际目的来说有点太慢了。

我渴望编译,我想使用最新和最好的工具。


这似乎也符合我的需要。我们正在为运行Arch Linux的ARM5开发。开发是在Ubuntu Linux 10.04 LTS上进行的(今天,也许我们明天升级它,我还不知道)。当前,我们正在运行GCC 4.4,但是对于C ++ 11语言功能,如果不需要GCC 4.7(最低要求)(如果不需要GCC 4.8(如果可以管理)的话),我需要做的事情将有所帮助。似乎所有可用于ARM的工具链(5个或其他任何工具)都已经过时了。是否可以从源代码构建交叉编译器工具链并支持我们想要的GCC?
mwpowellhtx

我在第二步有一点问题。实际上,我已经完成了./configure和make命令。一切正常。但是当我提示“安装”时,我收到一条错误消息:安装:缺少文件操作数

另请参阅:raspberrypi.stackexchange.com/q/14587/5538我作为一个骗子将其关闭,但我认为值得在此处进行链接,因为那里被接受的答案涉及此处未包含的相当详细的内容。
goldilocks

Answers:


60

我找到了这些说明,说明如何为Raspberry Pi构建交叉编译器。使用crosstool-ng工具简化配置交叉编译器构建A LOT(它具有基于curses的界面,并且支持GCC 4.7)是一个很好的介绍。

我遵循了这些步骤,并最终成功构建了4.7交叉编译器。

先决条件:需要以下软件包:bisonflexgperfgawklibtoolautomakeg ++,确保在继续之前已安装这些软件包。

  1. 首先crosstool-ng这里下载(我使用的是1.15.2版)。
  2. 解压缩发行版并执行./configure/ make/install
  3. 在文件系统中的某个位置创建一个新目录,以将其内置和cd嵌入其中。
  4. 运行ct-ng menuconfig。您将看到一组不错的菜单来配置构建。
  5. 进入路径和其他选项。启用标记为EXPERIMENTAL的“尝试”功能。
  6. 选择一个合适的Prefix目录。这是将在其中安装编译器和库的目录(任何情况都可以,只要确保该目录为空即可)。

    • 注意:具有对所选文件夹的写访问权也很重要
  7. 转到目标选项菜单。

    • 目标架构:手臂
    • 字节小字节序
    • 位数32位
  8. 您可能还需要设置浮点参数softfp(见为更多信息),但hardfp更适合Raspbian。

  9. 转到操作系统菜单,然后将目标操作系统更改为linux
  10. 转到C编译器菜单,然后选择gcc版本4.7.0(本文建议使用Linaro,但我设法使其与香草gcc一起使用)。还选择了您希望能够编译的其他语言(C ++,Fortran等)
  11. 转到C库菜单,然后选择一个。默认值是eglibc,但是它对我而言还不够完善,因此我使用了glibc(最新版本)。

    • 注意:在构建步骤13中。如果未安装subversion,则eglibc可能无法构建,因为无法从存储库中检索源
    • 注:eglibc不再是一部分为1.21.0版本,因为它缺乏发展。请参见eglibc这么久默认使用glibc crosstool-ng
  12. 保存更改时退出配置工具。
  13. ct-ng build在同一目录中运行。等待一会儿(在我的情况下大约是45分钟),您的交叉编译器应已准备就绪。

似乎工作很棒!


哇,45分钟是很长的时间。您的系统有多快?我现在在等
Jivings 2012年

好吧,也许它要少一些,但是它必须先编译所有先决条件,然后再编译bintools和gcc以及libc和libstdc ++,所以45分钟对我来说是合理的。

如果经过测试,我们能否添加有关如何正确安装这些文件和更新路径的详细信息?
Alex Chamberlain 2012年

2
另外,我认为我们应该使用hardfp,因为RPi支持它。
Alex Chamberlain 2012年

可能是,但是IIRC,Arch的GCC配置了softfp。我现在没有时间进行测试,但是我已经制作了答案社区Wiki,请随时进行改进。

19

我渴望编译,我想使用最新和最好的工具。

实际上,不需要自己构建最新最好的工具。在Raspberry Pi工具GitHub存储库上,您会找到用于交叉编译软件的X86_64x686工具链。

我建议使用x86-linux64-cross-arm-linux-hardfp工具链,因为它将针对硬浮点进行编译,这将导致系统更快。

$ arm-bcm2708hardfp-linux-gnueabi-gcc --version

arm-bcm2708-linux-gnueabi-gcc-4.5.1 (Broadcom-2708) 4.5.1
Copyright (C) 2010 Free Software Foundation, Inc.

注意:如果使用的是现有内核,则必须使用与内核匹配的工具链。HardFP应用程序无法在SoftFP内核上运行。


要使用工具链,只需签出存储库:

git clone https://github.com/raspberrypi/tools.git --depth 1

--depth参数意味着您不必等待存储库历史记录也下载完毕(因为我们将不再使用它)。

然后将二进制文件添加到您的PATH变量中:

export PATH=~/tools/arm-bcm2708/x86-linux64-cross-arm-linux-hardfp/bin:$PATH

或保留PATH:

echo "export PATH=~/tools/arm-bcm2708/x86-linux64-cross-arm-linux-hardfp/bin:$PATH" >> ~/.bashrc
source ~/.bashrc

要使用工具链进行编译,您现在可以添加CROSS_COMPILE参数。例如,运行时make

make CROSS_COMPILE=arm-bcm2708hardfp-linux-gnueabi- 

为了使此操作更容易,您可以bashrc再次将变量保存到:

echo "export TARGET=arm-bcm2708hardfp-linux-gnueabi" >> ~/.bashrc
source ~/.bashrc

现在在编译时使用变量:

make CROSS_COMPILE=${TARGET}

1
这似乎是gcc-4.5.1。

@Tibor不好吗?
吉文斯

@Jivings完全不能回答问题!
亚历克斯·张伯伦

1
我不同意反对票。@AlexChamberlain它为构建自己的工具链的耗时行为提供了一种有价值的替代方法。
吉文斯

2
@Jivings:这非常有帮助。同时,它是gcc4.7.1(我有史以来最好的),浮点立即可用。我无法使用克里斯(Tibor)发表的原始描述来使浮点数有效。非常感谢。

4

请注意,在64位系统上的centos 6.3上使用ct-ng构建工具链时,由于平台(显然)不支持静态链接,我被迫取消选择静态链接libstdc ++的选项。

同样,虽然最好使用git仓库中的预构建工具链,但该链似乎在Centos 6.3上不起作用-可能是因为它是为更现代的系统或其他东西构建的。我并没有真正尝试将其淘汰。



3

如果您希望受益于快速主机来为RPI编译内容,我建议通过chroot和QEMU在跨环境中工作。顺便说一下,这可以轻松地取代交叉编译器。

只需使用deboostrap / multistrap设置Debian跨环境

(请参阅QEMU / debootstrap方法一章),您已完成。



2

如果您安装了Ubuntu 64位版本以及Raspberry Pi SVN的工具,则会收到错误消息:

-bash: /home/I/toolchain/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-c++: 
No such file or directory

赶紧跑:

sudo apt-get install ia32-libs

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.