一 、 错误
编译器出现如下错误
..\..\Output\gpio.axf: Error: L6200E: Symbol OLED_F8x16 multiply defined (by oled.o and main.o).
二 、 错误背景说明
- const uint8_t OLED_F8x16[][16] 定义在OLED_Font.h中
- 在OLED_Font.h中 写有
- #ifndef __OLED_FONT_H
- #define __OLED_FONT_H
- #endif
- OLED_F8x16在其他的.c中均有调用(未修改其中数据)
- 其他的.c中均有#include "OLED_Font.h"
三 、 错误情况说明
-
头文件包含多次:如果
OLED_FONT_H
头文件在多个.c
文件中被包含,并且 OLED_F8x16数组在该头文件中被定义为非static
,则每个包含该头文件的.c
文件都会有一个 OLED_F8x16的副本。当这些.c
文件被编译成目标文件时,每个目标文件都会包含一个 OLED_F8x16的定义。 -
链接时冲突:在链接阶段,链接器会发现多个 OLED_F8x16的定义,并报告错误,因为它不知道应该使用哪个。
四、 解决方法
-
将数组定义为
static
:在头文件中将 OLED_F8x16定义为static
,这样它就不会在多个编译单元之间共享。但是,请注意,这会使 OLED_F8x16只在定义它的编译单元中可见,这可能不是您想要的效果,特别是如果您想在多个.c
文件中使用它。 -
在单个
.c
文件中定义数组:在一个.c
文件中定义 OLED_F8x16数组,并在头文件中使用extern
声明它。这样,其他.c
文件就可以通过包含头文件来访问该数组,但不会在每个.c
文件中都定义一个副本。-
在
oled_font.c
文件中 - 在
oled_font.h
文件中
-
-
使用内联函数或宏:虽然这不适用于数组,但如果您有类似的问题与函数或常量值,您可以考虑使用内联函数或宏来避免多重定义。