编译ARM时出现GCC错误

3

当我尝试使用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选项,不确定是否缺少某些重要选项。任何有关使用GCC编译ARM的启动指南都将非常有帮助。


你确定这不是针对你的主机平台的 gcc 吗?gcc -dumpmachine 输出什么? - starblue
1
“gcc -dumpmachine” 显示为 “x86_64-unknown-linux-gnu”。我猜这意味着我必须构建GCC以转储ARM代码。是这样吗? - Jean
是的,您至少需要安装“binutils”和“gcc”,如果您想进行调试,则还需要安装“gdb”。在网上搜索如何执行这些操作的说明。 - starblue
还有newlib(或者其他一些C库)? - starblue
3
获得一个已经构建完成的版本,https://launchpad.net/gcc-arm-embedded。 - auselen
+1只是为了强调其他ARM gcc交叉编译器包(Linaro或CodeSourcery工具链,和/或Ubuntu / Fedora的arm-eabi交叉编译器包)通常不专注于Cortex-M/R(请参见https://answers.launchpad.net/gcc-arm-embedded/+question/200472)。 - FrankH.
3个回答

4
正如starblue在评论中所暗示的那样,该错误是因为您正在使用专门为x86 CPU编译而构建的本地编译器,而不是用于编译到ARM的交叉编译器。
GCC在任何给定的编译器二进制文件中仅支持单个通用架构类型。因此,尽管相同的GCC副本可以编译32位和64位x86机器,但您无法使用相同的GCC副本同时编译到x86和ARM - 您需要一个特定于ARM的GCC。
(正如auselen所建议的那样,获取预构建版本将为您节省大量工作,即使您仅将其用作设置事物的起点。您至少需要GCC、binutils和C库,这些都是独立的开源项目,预构建版本已经完成了组合工作。我会推荐Sourcery CodeBench Lite,因为这是我们公司制作的并且我认为它是一个相当不错的选择。)

0
就像其他人已经指出的,您正在使用主机机器的编译器,而您需要一个为生成目标处理器代码的编译器(交叉编译器)。就像@Brooks建议的那样,您可以使用预先构建的工具链,但是如果您想自己制作交叉编译器、libc和binutils,那么有一个很好的工具叫做Crosstool-NG。它极大地简化了构建针对特定处理器生成代码的交叉编译器的过程,因此您不必使用通用的预构建工具链,通常为兼容处理器系列(例如,您可以调整工具链以生成特定目标的ASM,或者针对硬件FPU的浮点代码,该硬件FPU专用于您的处理器,而不仅仅使用软件浮点例程,这是大多数预构建工具链的默认设置)。


0

正如错误信息所说,-mcpu已被弃用,您应该使用其他选项。然而,“deprectated”仅意味着其使用可能不再得到支持;它仍将起作用。

ARM Cortex-M4是ARM架构V7E-M,因此您应该使用-march=armv7-m(文档没有明确列出armv7e-m,但自文档上次更新以来可能已添加)。 E实际上是M3和M4之间的区别 - DSP指令,因此编译器不会生成利用这些指令的代码。使用ARM的Cortex-M DSP库可能是利用这些指令使您的应用受益的最佳方法。如果您的部件具有FPU,则需要其他选项才能启用针对其的代码生成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接