C 臂连接错误“;使用VFP寄存器参数,main.elf不;仅在windows 8上?

C 臂连接错误“;使用VFP寄存器参数,main.elf不;仅在windows 8上?,c,gcc,arm,gnu,C,Gcc,Arm,Gnu,我正在尝试开始使用ARM STM32F4发现板,在Windows 8上使用“GNU工具”时,我遇到了一些奇怪的编译错误 目前我的代码非常简单: #include "stm32f4xx_conf.h" int main(void) {} 在Ubuntu12和Windows7上使用“make”命令进行编译,但在Windows8中出现以下错误。我在所有机器上安装了相同的工具链 C:/ProgramFiles(x86)/codesourcery/sourcery g++ lite/bin/./lib

我正在尝试开始使用ARM STM32F4发现板,在Windows 8上使用“GNU工具”时,我遇到了一些奇怪的编译错误

目前我的代码非常简单:

#include "stm32f4xx_conf.h"

int main(void)
{}
在Ubuntu12和Windows7上使用“make”命令进行编译,但在Windows8中出现以下错误。我在所有机器上安装了相同的工具链

C:/ProgramFiles(x86)/codesourcery/sourcery g++ lite/bin/./lib/gcc/arm none-eabi/4.5.1/../../../../../../../arm none-eabi/bin/ld.exe: 错误C:\Users\MyName\AppData\Local\Temp\cckUTM2f.o用户VFP寄存器 参数,main.elf不支持

我已经将这个错误缩小到标志“-mfloat abi=hard”,当切换到“-mfloat abi=soft”时,它允许代码编译,但是这与以前使用“-mfloat abi=hard”编译的其他文件冲突


有人知道为什么这只会发生在Windows 8上,以及如何修复它吗?如果需要更多信息,请告诉我。如果这是一个nooby问题,请提前道歉,因为我对这个问题非常陌生

解决方案实际上非常简单,这与工具链的安装程序没有正确设置PATH变量有关。要在windows 8中解决此问题,请转到Environment Variables=>System Variables,我在path变量中添加了“C:\Program Files(x86)\GNU Tools ARM Embedded\4.8 2014q1\bin”。安装程序把它放在了“用户名的用户变量”下,但由于这个原因,它不起作用

这个答案表面上看起来可能是不相关的,但这个错误消息是有间接原因的

首先,“Uses VFP register…”错误消息是由在构建中混合使用mfloat abi=soft和mfloat abi=hard选项直接导致的。对于要链接的所有对象,此设置必须一致

此错误的间接原因可能是由于Eclipse编辑器被项目的“.cproject”文件中的错误弄糊涂了。Eclipse编辑器经常重新连接文件链接,有时在您更改目录结构或文件位置时会自行中断。这也会影响gcc编译器的路径设置——对于项目文件的子集。虽然我还不确定到底是什么原因导致了此故障,但用备份副本替换.cproject文件为我纠正了此问题。在我的例子中,在添加include目录路径后,我注意到了.java.null.pointer错误。我还发现gcc编译器的另一条路径被用于工作区的一些本地源代码,但不是所有源代码。由于未知原因,两个gcc编译器使用了不同的浮点设置,因此出现了VFP寄存器错误


我将.cproject设置与较旧的副本进行了比较,并观察到导致问题的源的条目存在差异——即使禁用了对项目设置的覆盖。通过将.cproject文件替换为旧版本,问题就消失了,我留下这个文件是为了提醒大家发生了什么。

经过进一步调查,如果有帮助的话,我发现“arm none eabi gcc-print multi directory-marm-mfloat abi=hard”在Windows 7上返回“fpu”,但在Windows 8上“另一个观察结果,如果我通过“C:/Users/Program Files(x86)/GNU Tools ARM Embedded/4.9 2014q1/bin/gccvar.bat”打开命令提示符,我可以在Windows 8上很好地编译代码。这个解决方案适合我。问题是源文件是使用标志-mhard float编译的,而LinkederDIN没有使用它。因此,不要在编译器和链接器之间混合浮点标志