【问题标题】:GCC Error while compiling for ARM为 ARM 编译时出现 GCC 错误
【发布时间】:2012-10-31 19:36:30
【问题描述】:

我在尝试为 ARM Cortex-M4 编译一些代码时遇到以下错误 使用

gcc -mcpu=cortex-m4 arm.c  

`-mcpu=' is deprecated. Use `-mtune=' or '-march=' instead.
arm.c:1: error: bad value (cortex-m4) for -mtune= switch

我在关注GCC 4.7.1 ARM options。不确定我是否遗漏了一些关键选项。任何将 GCC 用于 ARM 的启动也将非常有帮助。

【问题讨论】:

  • 您确定这不是您的主机平台的gcc 吗? gcc -dumpmachine 说什么?
  • gcc -dumpmachinex86_64-unknown-linux-gnu。我想这意味着我将不得不构建 GCC 来为 ARM 转储代码。是这样吗?
  • 是的。如果要调试,至少需要binutilsgccgdb。在网上搜索如何操作的说明。
  • 还有newlib(或者其他一些C库?)。
  • 得到一个已经建好的,launchpad.net/gcc-arm-embedded

标签: c gcc linker embedded arm


【解决方案1】:

正如 starblue 在评论中暗示的那样,该错误是因为您使用的是为编译 x86 CPU 而构建的本机编译器,而不是用于编译到 ARM 的交叉编译器。

GCC 在任何给定的编译器二进制文件中仅支持单一通用架构类型——因此,尽管 GCC 的同一份副本可以为 32 位和 64 位 x86 机器编译,但您不能同时编译为 x86 和 ARM使用相同的 GCC 副本——您需要一个特定于 ARM 的 GCC。

(正如 auselen 所建议的那样,即使您只是将其作为开始设置的起点,获得一个预建的也可以为您节省大量工作。您需要有 GCC、binutils 和至少一个 C 库,这些都是独立的开源项目,预构建版本已经完成了组合工作。我会推荐Sourcery CodeBench Lite,因为这是我公司生产的,我认为这是一个相当不错。)

【讨论】:

    【解决方案2】:

    正如错误消息所说,-mcpu 已被弃用,您应该使用所述的其他选项。然而,“已弃用”仅仅意味着它的使用可能不会继续得到支持;它仍然可以工作。

    ARM Cortex-M4 是 ARM Architecture V7E-M,所以你应该使用-march=armv7-m(文档没有具体列出armv7e-m,但自文档上次更新以来可能已经添加。E 是本质上是 M3 和 M4 之间的区别 - DSP 指令,因此编译器不会生成利用这些指令的代码。使用 ARM 的 Cortex-M DSP 库可能是使用这些指令使您的应用程序受益的最佳方式。如果你的部分有一个 FPU,则需要其他选项来启用代码生成。

    【讨论】:

      【解决方案3】:

      就像其他人已经指出的那样,您正在为您的主机使用编译器,并且您需要一个编译器来为您的目标处理器生成代码(交叉编译器)。就像@Brooks 建议的那样,您可以使用预构建的工具链,但如果您想推出自己的交叉编译器、libc 和 binutils,有一个不错的工具叫做Crosstool-NG。它极大地简化了构建一个为特定处理器生成代码而优化的交叉编译器的过程,因此您不会被一个通用的预构建工具链所束缚,它通常为一系列兼容的处理器构建代码(例如,您可以调整工具链以适应为您的特定目标生成 ASM,或为特定于您的处理器的硬件 FPU 生成浮点代码,而不是仅使用大多数预构建工具链默认的软件浮点例程。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-11
        • 1970-01-01
        • 2012-02-11
        • 1970-01-01
        • 1970-01-01
        • 2019-01-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多