未定义引用`__aeabi_ddiv'和朋友 - 没有stdlib但是-mfloat-abi = hard

时间:2014-10-21 15:33:09

标签: gcc arm cortex-m

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

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

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'

为什么?如果我理解正确,它不应该依赖库函数,而是使用ARM本机FPU指令。

2 个答案:

答案 0 :(得分:6)

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

你可以注意到所有丢失的__aeabi东西都有一个'd'(如双倍)。

如果您的代码中有浮点文字,则按C标准,它们被视为双精度。您可以通过在文字末尾添加fF来强制它们达到单精度范围。

  

2.13.3浮动文字:除非明确指定,否则浮动文字的类型为double   后缀。后缀f和F指定float ...

答案 1 :(得分:1)

众所周知,在C中,浮点文字(例如1.23)具有double类型。因此,任何涉及它们的计算都会提升到两倍。

要解决此问题,请添加' f'到所有文字的末尾,即

if (x < 2.5) ...

if (x < 2.5f) ...