STM32CubeIDE开发stm32f746g-disco DCMI项目报多重定义错误如何解决
你遇到的是典型的链接阶段多重定义错误,错误原因是Font24、Font24_Table两个全局符号在多个编译目标文件中被重复定义,按照以下优先级排查即可解决:
- 第一步:确认头文件声明格式正确
全局变量的声明必须加extern关键字,且只能放在头文件中,变量的具体定义必须放在.c文件中。
以你的字体文件为例,font24.h的正确写法如下:
// 必须加头文件防护,防止重复引入 #ifndef __FONT24_H #define __FONT24_H #include <stdint.h> // 假设sFONT是你的字体结构体定义 typedef struct { const uint8_t *table; uint16_t width; uint16_t height; } sFONT; // 仅做声明,加extern关键字 extern const uint8_t Font24_Table[]; extern sFONT Font24; #endif
font24.c中只保留变量的定义,不要加extern:
#include "font24.h" // 具体定义,直接写变量内容 const uint8_t Font24_Table[] = { // 你的字模数据 }; sFONT Font24 = { .table = Font24_Table, .width = 24, .height = 24 };
第二步:检查是否有误引入.c文件的问题
查看main.c的头部引入部分,确认只有#include "font24.h",没有#include "font24.c"这类错误写法。如果直接引入.c文件,相当于把font24.c的全部内容复制到main.c中编译,会导致main.o和font24.o同时存在这两个符号的定义。第三步:清理项目缓存重新编译
STM32CubeIDE经常会出现缓存未清理的问题,直接点击顶部菜单栏Project -> Clean选中对应项目清理,或者手动删除项目目录下的Debug文件夹后重新构建项目,即可清除旧的缓存目标文件。第四步:检查源文件编译列表
右键项目选择Properties -> C/C++ General -> Paths and Symbols -> Source Location,确认font24.c在编译列表中仅出现一次,没有重复添加的情况。
内容的提问来源于stack exchange,提问作者beyonson
相关产品推荐
相关产品推荐

