Gcc 未定义的对“aeabi ddiv&”的引用;和朋友-不使用stdlib,但使用-mfloat abi=hard建立友谊

Gcc 未定义的对“aeabi ddiv&”的引用;和朋友-不使用stdlib,但使用-mfloat abi=hard建立友谊,gcc,arm,cortex-m,Gcc,Arm,Cortex M,我正在尝试为Cortex-M4F构建一个项目。该芯片有一个FPU,所以我正在使用-mfpu=fpv4-sp-d16-mfloat abi=hard构建,并且我没有使用任何库来节省空间,所以我使用-nostlib-fno内置 现在我想使用浮点运算,但这样做时会出现链接器错误: led1642gw_gain.c:(.text.led_calculateGain+0xc): undefined reference to `__aeabi_f2d' led1642gw_gain.c:(.text.led

我正在尝试为Cortex-M4F构建一个项目。该芯片有一个FPU,所以我正在使用
-mfpu=fpv4-sp-d16-mfloat abi=hard
构建,并且我没有使用任何库来节省空间,所以我使用
-nostlib-fno内置

现在我想使用浮点运算,但这样做时会出现链接器错误:

led1642gw_gain.c:(.text.led_calculateGain+0xc): undefined reference to `__aeabi_f2d'
led1642gw_gain.c:(.text.led_calculateGain+0x24): undefined reference to `__aeabi_ddiv'
led1642gw_gain.c:(.text.led_calculateGain+0x36): undefined reference to `__aeabi_dsub'
led1642gw_gain.c:(.text.led_calculateGain+0x48): undefined reference to `__aeabi_ddiv'
led1642gw_gain.c:(.text.led_calculateGain+0x54): undefined reference to `__aeabi_d2f'
led1642gw_gain.c:(.text.led_calculateGain+0x9e): undefined reference to `__aeabi_f2d'
led1642gw_gain.c:(.text.led_calculateGain+0xb6): undefined reference to `__aeabi_ddiv'
led1642gw_gain.c:(.text.led_calculateGain+0xc8): undefined reference to `__aeabi_dsub'
led1642gw_gain.c:(.text.led_calculateGain+0xda): undefined reference to `__aeabi_ddiv'
led1642gw_gain.c:(.text.led_calculateGain+0xe6): undefined reference to `__aeabi_d2f'
led1642gw_gain.c:(.text.led_calculateGain+0x10c): undefined reference to `__aeabi_f2d'

为什么呢?如果我理解正确,它不应该依赖于库函数,而应该使用ARMs本机FPU指令来实现这一点。

您的核心支持单精度浮点指令,但您的代码使用双精度浮点

你可以注意到所有缺少的uu aeabi元素都有一个“d”(如double中所述)

如果代码中有浮点文本,按照C标准,它们被认为是双重的。您可以通过在文本末尾添加
f
f
将其强制为单精度范围

2.13.3浮动文字:浮动文字的类型为双精度,除非 后缀。后缀f和f指定浮点


众所周知,在C语言中,浮点文本(例如1.23)的类型为double。因此,任何涉及它们的计算都会升级到双倍

要解决此问题,请在所有文字的末尾添加“f”,即:

if (x < 2.5) ...
if(x<2.5)。。。

if(x<2.5f)。。。
if (x < 2.5f) ...