You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32 CMake添加-u _printf_float后符号重定义错误的解决方法

解决STM32 CMake项目添加-u _printf_float后的符号重定义问题

问题背景

我通过CubeMX生成STM32项目,使用CubeMX自带Makefile时,只需在库配置中添加-u _printf_float即可实现sprintf和UART的浮点数打印,当时的配置为:

LIBS = -lc -lm -lnosys -lrdimon -u _printf_float

之后将项目改为CMake配置(基于STM32 CMake模板),修复基础问题后可正常编译,但在CMakeLists.txt的链接选项中加入-u _printf_float后,链接器报出符号重复定义错误:

/usr/lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/lib/thumb/v7-m/nofp/librdimon_nano.a(rdimon-syscalls.o): in function `_lseek':
syscalls.c:(.text._lseek+0x0): multiple definition of `_lseek'; /usr/lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/lib/thumb/v7-m/nofp/libnosys.a(lseek.o):lseek.c:(.text._lseek+0x0): first defined here
/usr/lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/lib/thumb/v7-m/nofp/librdimon_nano.a(rdimon-syscalls.o): in function `_close':
syscalls.c:(.text._close+0x0): multiple definition of `_close'; /usr/lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/lib/thumb/v7-m/nofp/libnosys.a(close.o):close.c:(.text._close+0x0): first defined here
/usr/lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/lib/thumb/v7-m/nofp/librdimon_nano.a(rdimon-syscalls.o): in function `_isatty':
syscalls.c:(.text._isatty+0x0): multiple definition of `_isatty'; /usr/lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/lib/thumb/v7-m/nofp/libnosys.a(isatty.o):isatty.c:(.text._isatty+0x0): first defined here

核心原因

错误源于同时启用了nosys.specs和rdimon.specs,这两个规范对应的库都实现了相同的系统调用函数(如_lseek、_close),导致链接器识别到重复符号定义。

解决步骤

1. 清理工具链文件中的冲突规范

修改gcc-arm-none-eabi.cmake中的CMAKE_C_FLAGS_INIT,移除--specs=nosys.specs,因为rdimon.specs已包含必要的系统调用实现,无需同时依赖nosys:

set(CMAKE_C_FLAGS_INIT
    "-fdata-sections -ffunction-sections --specs=nano.specs --specs=rdimon.specs -Wl,--gc-sections")

2. 调整CMakeLists.txt的链接选项

  • 移除链接选项中的-lnosys,避免重复链接nosys库
  • 将-u _printf_float和-lrdimon加入链接选项,确保浮点数打印符号被正确链接

修改后的target_link_options如下:

target_link_options(${EXECUTABLE} PRIVATE
    -T${MCU_LINKER_SCRIPT}
    ${CPU_PARAMETERS}
    -Wl,-Map=${CMAKE_PROJECT_NAME}.map
    -Wl,--start-group
    -lc
    -lm
    -lstdc++
    -lrdimon
    -u _printf_float
    -Wl,--end-group
    -Wl,--print-memory-usage)

3. 验证功能

重新编译项目,链接器不再报重复定义错误,同时sprintf和UART的浮点数打印功能可正常工作。

可选替代方案:若不需要rdimon的半主机调试功能,可保留nosys.specs并移除rdimon.specs,手动实现_write函数适配UART输出,再添加-u _printf_float。但该方案需要额外编写系统调用适配代码,不如直接使用rdimon简洁。

内容的提问来源于stack exchange,提问作者mehdi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 13:16:58