undefined reference to `__aeabi_ddiv' and friends - 带有-mfloat-abi=hard但不带stdlib的构建

11

我正在尝试为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个回答

9

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

您可以注意到所有缺失的__aeabi内容都有一个'd'(表示双精度)。

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

2.13.3 浮点文字:浮点文字的类型是double,除非通过后缀显式指定。 后缀f和F指定float ...


2

众所周知,在 C 语言中,浮点数字面值(如 1.23)的类型为 double。因此,任何涉及它们的计算都会被提升为 double 类型。

为了解决这个问题,在所有数字面值后面添加 'f' 即可,例如:

if (x < 2.5) ...

为了

if (x < 2.5f) ...

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