CLion编译STM32项目报错:sin_table变量多重定义求助
解决STM32项目编译时
sin_table多重定义问题 链接器错误信息
f:/my_app/gcc-arm/gcc-arm-none-eabi-10.3-2021.10/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/bin/ld.exe: CMakeFiles/OLED.elf.dir/Core/Src/gpio.c.obj:F:\STM32\Oled\Core\Inc/oled_animation.h:45: multiple definition of `sin_table'; CMakeFiles/OLED.elf.dir/Core/Src/dma.c.obj:F:\STM32\Oled\Core\Inc/oled_animation.h:45: first defined here f:/my_app/gcc-arm/gcc-arm-none-eabi-10.3-2021.10/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/bin/ld.exe: CMakeFiles/OLED.elf.dir/Core/Src/main.c.obj:F:\STM32\Oled\Core\Inc/oled_animation.h:45: multiple definition of `sin_table'; CMakeFiles/OLED.elf.dir/Core/Src/dma.c.obj:F:\STM32\Oled\Core\Inc/oled_animation.h:45: first defined here
问题背景
错误提示sin_table变量存在多重定义,但仅在oled_animation.h头文件中编写了该变量相关代码。涉及的头文件包含关系:
oled_animation.h内容:#include "oled.h"oled_ui.h内容:#include "oled.h" #include "oled_animation.h"
注释掉oled_animation.h后报错消失,但将oled_ui.h加入oled_animation.h时无编译错误,需解决该问题。
问题根源
你在oled_animation.h第45行是直接定义了sin_table(例如int sin_table[256];),而非仅声明。当多个.c源文件包含该头文件时,每个编译单元都会生成一个sin_table的实体定义,链接阶段就会触发多重定义错误。头文件的包含关系只是让这个问题暴露,并非冲突本身。
解决步骤
修改头文件的变量声明
在oled_animation.h中,将变量定义改为用extern声明(不分配内存):extern int sin_table[256]; // 仅声明变量,告知编译器该变量在其他地方定义在源文件中定义变量
创建或修改oled_animation.c文件,在其中唯一一次定义sin_table并初始化:int sin_table[256] = { /* 填入你的初始化数据 */ }; // 实际分配内存,仅定义一次添加头文件保护
给所有涉及的头文件添加头文件保护,避免重复包含导致的潜在编译问题:
以oled_animation.h为例:#ifndef OLED_ANIMATION_H #define OLED_ANIMATION_H // 原头文件内容(包含extern声明) #include "oled.h" extern int sin_table[256]; #endif // OLED_ANIMATION_H同样给
oled_ui.h、oled.h添加类似的保护。
补充说明
注释掉oled_animation.h后报错消失,是因为此时只有单个编译单元包含该头文件,仅生成一个变量定义;而将oled_ui.h加入oled_animation.h时,可能因包含链的变化,恰好没有多个编译单元重复包含该头文件,但这只是临时规避,并非正确解决方案。
内容的提问来源于stack exchange,提问作者Jamth
相关产品推荐
相关产品推荐

