问题现象(CubeMX + CLion + CMake)
使用 CubeMX 生成工程、勾选 DSP 中间件后,能正常 #include "arm_math.h",但调用 arm_sin_f32() 等函数时报如下错误:
undefined reference to 'arm_sin_f32'问题根源
arm_math.h只是头文件,声明了函数,但没有实现。STM32CubeMX 默认只生成了:
Middlewares/ST/ARM/DSP/Inc/ ✅ 头文件 Middlewares/ST/ARM/DSP/Lib/ ❌ 预编译库(未自动链接)并没有包含源码
Source/或自动链接静态库.a,因此函数找不到实现,链接失败。
解决方法:链接预编译静态库
步骤 1:确认 .a 文件路径
打开目录:
Middlewares/ST/ARM/DSP/Lib/找到类似:
libarm_cortexM4lf_math.a解释:
cortexM4:适用于 Cortex-M4 内核(比如 STM32F4、G4、L4 等)lf:表示 支持硬件浮点(link with FPU)- 还有其他版本如
libarm_cortexM4l_math.a(soft-float)
步骤 2:在 CMakeLists.txt 中链接库
在 add_executable(...) 后添加:
target_link_libraries(${PROJECT_NAME}.elf
${CMAKE_SOURCE_DIR}/Middlewares/ST/ARM/DSP/Lib/libarm_cortexM4lf_math.a
)步骤 3:添加 FPU 支持编译和链接参数
target_compile_options(${PROJECT_NAME}.elf PRIVATE
-mfloat-abi=hard -mfpu=fpv4-sp-d16
)
target_link_options(${PROJECT_NAME}.elf PRIVATE
-mfloat-abi=hard -mfpu=fpv4-sp-d16
)注意事项
- 如果用的是其他内核(如 Cortex-M7),要将
CM4改为CM7。 - 如果
.a是 soft-float 版本(不含f),-mfloat-abi要设为softfp。