我正在尝试为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'
Run Code Online (Sandbox Code Playgroud)
这是为什么?如果我理解正确,它不应该依赖库函数,而是使用ARM本机FPU指令.
您的内核支持单精度浮点指令,但您的代码使用双精度浮点.
您可以注意到所有丢失的__aeabi内容都有一个'd'(如双倍).
如果您的代码中有浮点文字,则按C标准,它们被视为双精度.您可以通过在文字的末尾添加f
或强制它们进入单精度范围F
.
2.13.3浮动文字:除非后缀明确指定,否则浮动文字的类型为double.后缀f和F指定float ...