标签 CLion 下的文章


问题现象(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