【问题标题】:How to compile a gcc compiler for arm on a X86 PC如何在 X86 PC 上为 arm 编译 gcc 编译器
【发布时间】:2017-06-03 03:49:37
【问题描述】:

我正在使用 zedboard,我知道如果我想为 ARM 设备编译一个程序,我需要一个在 x86 下运行并为 ARM 编译的特殊版本的 gcc(交叉编译),我想知道是否有可能从 x86 上的源代码编译 gcc(将在 ARM 上使用),以及如何,我不知道如何配置它。

【问题讨论】:

  • GCC 不能在裸 x86 上运行,它可以在带有某些特定操作系统的 x86 上运行(这很重要;Linux 和 MacOSX 上的情况有所不同)
  • 这个问题太宽泛了。
  • ThingWotsit:如果您曾经使用过 ZedBoard,您就会知道这是一个非常具体的问题,并且您也会遇到过。

标签: c++ c gcc arm


【解决方案1】:

这是一项艰巨但可行的任务。

这取决于您编译的 ARM 系列。 在许多系统上,您会发现运行“迷你 Linux 发行版”的 Cortex-A(armv7-a 或更高版本)或 ARM11(armv6)处理器,许多 POS(销售点)设备就是这种情况。在这种情况下,您的目标可以是以下之一:

  • arm-linux-gnueabi
  • arm-linux-gnueabihf

其中hf代表hard-float,意思是CPU有一个FPU(floating-point unit),所有的Cortex-A都支持这个,但也取决于底层的OS。了解嵌入式 Linux 上 glibc 的版本也很重要,因为如果编译器和操作系统之间的版本不同,可能会出现意外行为。

如果您要针对没有 MMU(Memory Magament Unit)的 ARM 处理器(例如 Cortex-R 或 Cortex-M 系列)进行编译,并且因此不支持 Linux(仅支持 FreeRTOS 等微内核),您的目标将是(也称为作为裸机):

  • arm-none-eabi

ARM 现在分发 GCC 的二进制文件:

https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads

以前是 Linaro。但是,如果您需要,他们会为 arm-linu-gnueabi(软浮点)保留 GCC 7.x。

https://releases.linaro.org/components/toolchain/binaries/latest-7/

Linaro 还使用了一个称为 ABE 的构建系统,我没有找到太多关于它的文档,但他们使用它来配置和构建他们分发的工具链。

如果上述方法都不适合您,您仍然可以构建自己的工具链,我建议使用 crosstool-ng 来完成该任务: https://crosstool-ng.github.io/

在像 Ubuntu 这样的 Linux 操作系统下效果最好(您仍然可以尝试使用 Cygwin 在 Windows 上构建它,但可能需要更多时间)。请注意,您不需要在要运行它的机器上编译它,这意味着您可以在 Ubuntu 上编译将在 Windows 上运行的 GCC,该 GCC 将生成在 ARM 处理器上运行的程序,这被称为加拿大十字。

【讨论】:

    【解决方案2】:

    我建议获取一个交叉编译器二进制文件。在 Linux 发行版上,它通常已经打包。

    但是,如果您坚持从源代码构建 GCC(但要注意依赖关系),请阅读 Installing GCCConfiguring GCC。您应该在源代码树的外部 构建它,并且您希望传递一些特定的--target= 选项。我还推荐--program-suffix=_my

    (我不知道--target 与您的特定配置和电路板相关;您需要了解)

    请注意,目标不仅是 CPU,而且是 OS....

    【讨论】:

    • 它也经常涉及libc。 Linux 是一个操作系统,但仿生、glibc、ucLibc 和 muscl 都是不同的“C”库。您需要为主机 (x86) 和目标 (ARM) 正确设置此三元组,以获得最佳效果。
    【解决方案3】:

    您只需要一个交叉编译器。您在 x86 机器上安装交叉编译器,它将为 arm 生成机器代码。我推荐使用GNU arm embedded toolchain

    之后,您将完全像任何其他 c/c++ 代码一样编译,除了您会执行 arm-none-eabi-gcc(或 g++)而不仅仅是 gcc 或 g++

    如果您正在使用裸机,请注意,因为 printf() 等函数可能无法在没有额外工作的情况下工作。

    【讨论】:

      【解决方案4】:

      我认为你可以得到 arm 的交叉编译工具链。如arm-linux-gcc、arm-linux-g++等。通常工具链是arm设备的附加产品。如果你想在arm的应用程序中使用共享库(libxxx.so),你可以使用交叉编译工具链和库的源代码来构建这些库。比如arm库的构建步骤如下:

      //step 1: configure the cross compilation toolchain in PC. If the 
      //command line "arm-linux-gcc -v" can implemented in your PC(linux os) , which means the environment is right.
      //step 2: get the open source of the library and decompress
      tar -zxvf  jpegsrc.v6b.tar.gz
      //./configure --host=arm-linux  --prefix=/your/install/directory
      // make && make install
      

      你可以得到 arm 的库。希望对你有帮助!

      【讨论】:

      • 选项“--host=arm-linux”的作用将configure创建的Makefile中的gcc替换为arm-linux-gcc。
      【解决方案5】:

      这个问题有两种解决方案。首先是交叉编译二进制文件,然后将其复制过来。喜欢:

      sudo apt-get install gcc-arm-linux-gnueabi
      vi helloworld.c
      arm-linux-gnueabi-gcc -o helloworld helloworld.c
      

      然后 ftp 过来。

      另一种是交叉编译整个gcc工具链并复制过来。我建议最初做第一个。尤其是 initrd 只有 8MB 并且扩展它很麻烦,试图将整个操作系统放到 sd 卡上也是有问题的。您必须编译比特流,这似乎需要 2000 磅版本的 vivado。

      【讨论】:

        【解决方案6】:

        您可以在 x86 上使用这些命令:

        对于 ARM 32b:

        arm-linux-gnueabi-gcc
        

        对于 ARM 64b:

        aarch64-linux-gnu-gcc
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-11-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-22
          相关资源
          最近更新 更多