编译出现multiply defined 多重定义错误

一 、 错误

编译器出现如下错误

..\..\Output\gpio.axf: Error: L6200E: Symbol OLED_F8x16 multiply defined (by oled.o and main.o).

二 、 错误背景说明

  1. const uint8_t OLED_F8x16[][16] 定义在OLED_Font.h中
  2. 在OLED_Font.h中  写有     
    1. #ifndef __OLED_FONT_H        
    2. #define __OLED_FONT_H
    3. #endif
  3. OLED_F8x16在其他的.c中均有调用(未修改其中数据)
  4. 其他的.c中均有#include "OLED_Font.h"

三 、 错误情况说明

  1. 头文件包含多次:如果 OLED_FONT_H 头文件在多个 .c 文件中被包含,并且 OLED_F8x16数组在该头文件中被定义为非 static,则每个包含该头文件的 .c 文件都会有一个 OLED_F8x16的副本。当这些 .c 文件被编译成目标文件时,每个目标文件都会包含一个 OLED_F8x16的定义。

  2. 链接时冲突:在链接阶段,链接器会发现多个 OLED_F8x16的定义,并报告错误,因为它不知道应该使用哪个。

四、 解决方法

  1. 将数组定义为 static:在头文件中将 OLED_F8x16定义为 static,这样它就不会在多个编译单元之间共享。但是,请注意,这会使 OLED_F8x16只在定义它的编译单元中可见,这可能不是您想要的效果,特别是如果您想在多个 .c 文件中使用它。

  2. 在单个 .c 文件中定义数组:在一个 .c 文件中定义 OLED_F8x16数组,并在头文件中使用 extern 声明它。这样,其他 .c 文件就可以通过包含头文件来访问该数组,但不会在每个 .c 文件中都定义一个副本。

    1.         在 oled_font.c 文件中

    2. ​​​​​在 oled_font.h 文件中
  3. 使用内联函数或宏:虽然这不适用于数组,但如果您有类似的问题与函数或常量值,您可以考虑使用内联函数或宏来避免多重定义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值