关于OLED移植出现Symbol oled_pow multiply defined

简介: 关于OLED移植出现Symbol oled_pow multiply defined

问题

今天督促队友写代码,他反馈移植的OELD代码报错Symbol oled_pow multiply defined。我查看了一下,发现在main.c和SR04.c中都引用了OLED(#include "oled.h")。如果将超声波代码里面的#include "oled.h"注释掉就没有报错了,我查看了他头文件,发现加上了#ifndef __OLED_H_#define __OLED_H_#endif。测试了几次还是一大堆的Symbol oled_pow multiply defined 报错。


报错

Robot_competition\Robot_competition.axf: Error: L6200E: Symbol F6x8 multiply defined (by main.o and sr04.o).
Robot_competition\Robot_competition.axf: Error: L6200E: Symbol F8X16 multiply defined (by main.o and sr04.o).
Robot_competition\Robot_competition.axf: Error: L6200E: Symbol Hzk multiply defined (by main.o and sr04.o).
Robot_competition\Robot_competition.axf: Error: L6200E: Symbol BMP multiply defined (by main.o and sr04.o).
Robot_competition\Robot_competition.axf: Error: L6200E: Symbol BMP1 multiply defined (by main.o and sr04.o).
Robot_competition\Robot_competition.axf: Error: L6200E: Symbol BMP2 multiply defined (by main.o and sr04.o).
Robot_competition\Robot_competition.axf: Error: L6200E: Symbol BMP3 multiply defined (by main.o and sr04.o).
Robot_competition\Robot_competition.axf: Error: L6200E: Symbol IIC_Start multiply defined (by main.o and sr04.o).
Robot_competition\Robot_competition.axf: Error: L6200E: Symbol IIC_Stop multiply defined (by main.o and sr04.o).
Robot_competition\Robot_competition.axf: Error: L6200E: Symbol IIC_Wait_Ack multiply defined (by main.o and sr04.o).
Robot_competition\Robot_competition.axf: Error: L6200E: Symbol OLED_Clear multiply defined (by main.o and sr04.o).
Robot_competition\Robot_competition.axf: Error: L6200E: Symbol OLED_Display_On multiply defined (by main.o and sr04.o).
Robot_competition\Robot_competition.axf: Error: L6200E: Symbol OLED_DrawBMP multiply defined (by main.o and sr04.o).
Robot_competition\Robot_competition.axf: Error: L6200E: Symbol OLED_GPIO multiply defined (by main.o and sr04.o).
Robot_competition\Robot_competition.axf: Error: L6200E: Symbol OLED_Init multiply defined (by main.o and sr04.o).
Robot_competition\Robot_competition.axf: Error: L6200E: Symbol OLED_Set_Pos multiply defined (by main.o and sr04.o).
Robot_competition\Robot_competition.axf: Error: L6200E: Symbol OLED_ShowCHinese multiply defined (by main.o and sr04.o).
Robot_competition\Robot_competition.axf: Error: L6200E: Symbol OLED_ShowChar multiply defined (by main.o and sr04.o).
Robot_competition\Robot_competition.axf: Error: L6200E: Symbol OLED_ShowNum multiply defined (by main.o and sr04.o).
Robot_competition\Robot_competition.axf: Error: L6200E: Symbol OLED_ShowString multiply defined (by main.o and sr04.o).
Robot_competition\Robot_competition.axf: Error: L6200E: Symbol OLED_WR_Byte multiply defined (by main.o and sr04.o).
Robot_competition\Robot_competition.axf: Error: L6200E: Symbol Write_IIC_Byte multiply defined (by main.o and sr04.o).
Robot_competition\Robot_competition.axf: Error: L6200E: Symbol Write_IIC_Command multiply defined (by main.o and sr04.o).
Robot_competition\Robot_competition.axf: Error: L6200E: Symbol Write_IIC_Data multiply defined (by main.o and sr04.o).
Robot_competition\Robot_competition.axf: Error: L6200E: Symbol oled_pow multiply defined (by main.o and sr04.o).


尝试过程

(1)于是我开始加入extern关键字,发现依旧无用。

(2)然后我就开始查看他的OLED代码,发现OLED代码似乎也没有问题。

(3)然后我突然想到了去字模库看看。后面发现,他将所有的字模变量定义都放在了.h文件。

(4)然后我突然想起我也遇到过类似的问题,然后搜索了一下,在头文件定义变量有什么问题。结果是得到: 头文件中不可以放变量的定义 ! 一般头文件中只是放变量的声明,因为头文件要被其他文件包含#include,如果把定义放在头文件的话,就不能避免多次 定义变量 。



结论

我们的OLED字模变量定义应该放在.C文件中,而不是.h文件。只需要把.h文件剪切到.C文件即可。
目录
相关文章
【琐琐碎碎小知识】Keil5编译时候出现 Error: L6200E: Symbol HAL_MspDeInit multiply defined事故处理
【琐琐碎碎小知识】Keil5编译时候出现 Error: L6200E: Symbol HAL_MspDeInit multiply defined事故处理
739 0
【琐琐碎碎小知识】Keil5编译时候出现 Error: L6200E: Symbol HAL_MspDeInit multiply defined事故处理
|
30天前
|
JavaScript 前端开发
ES6:什么是Symbol?
ES6:什么是Symbol?
24 1
|
30天前
ES6之Symbol
ES6之Symbol
|
30天前
|
JavaScript 前端开发
|
30天前
|
JavaScript 前端开发 开发者
|
30天前
|
存储 JavaScript
ES6+新特性-Symbol与Set/Map数据结构
ES6 引入了三种新的数据结构:Symbol、Set和Map。Symbol是唯一且不可变的值,常用于定义对象的独特属性;Set存储不重复值,适合数组去重;Map则是键值对集合,键可为任意类型,提供了更灵活的存储方式。这些新数据结构提供了更高效的操作手段,分别解决了属性命名冲突、数据去重和复杂键值对存储的问题。示例展示了如何使用Symbol、Set和Map进行基本操作。
|
30天前
|
JavaScript
js开发:请解释什么是ES6的Symbol,以及它的用途。
ES6的Symbol数据类型创建唯一值,常用于对象属性键(防冲突)和私有属性。示例展示了如何创建及使用Symbol:即使描述相同,两个Symbol也不等;作为对象属性如`obj[symbol1] = 'value1'`;也可作枚举值,如`Color.RED = Symbol('red')`。
|
30天前
|
JavaScript 前端开发
ES6之原始数据类型Symbol
ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。它属于 JavaScript 语言的原生数据类型之一,其他数据类型是:undefined、null、布尔值(Boolean)、字符串(String)、数值(Number)、大整数(BigInt)、对象(Object)。Symbol的作用是创建一个不可变且唯一的标识符,可以用作对象属性的键。它可以用来解决属性名冲突的问题,避免命名冲突。
42 0
|
9月前
ES6: Symbol概念与用法举例
ES6: Symbol概念与用法举例
30 0