[keil]L6200E: Symbol XXX multiply defined .O...错误解决方法

文章讲述了在C语言编程中,全局变量在多文件共用时可能出现的重定义错误,解释了错误原因并给出了使用extern关键字正确声明和定义外部变量的方法,强调了变量定义与声明的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.问题原因

出现这个的原因往往是因为在我们使用全局变量的时候出现了问题(出现了重定义)

二.解释原因

在我们写程序的时候用全局变量,希望在头文件上面定义一个全局变量,让他们包含到两个不同的c文件中进行共用,由于使用错误往往会出现[keil]L6200E: Symbol XXX multiply defined .O...的情况。

三.解决方法

举例说明:项目文件夹project下有main.c、common.c和common.h三个文件,其中common.h文件分别#include在main.c和common.c文件中。现在希望声明一个字符型变量key,在main.c和common.c中公用。

有人想,既然是想两个文件都用,那就在common.h中声明一个unsigned char key,然后由于包含关系,在main.c和common.c中都是可见的,所以就能共用了。

想起来确实有道理,但是实际写出来,我们发现编译的时候编译器提示出错,一般提示大概都类似于:Error: L6200E: Symbol key multiply defined (by common.o and main.o).也就是说编译器认为我们重复定义了key这个变量。这是因为#include命令就是原封不同的把头文件中的内容搬到#include的位置,所以相当于main.c和common.c中都执行了一次unsigned char key,而C语言中全局变量是项目内(或者叫工程内)可见的,这样就造成了一个项目中两个变量key,编译器就认为是重复定义。

正确的解决办法:使用extern关键字来声明变量为外部变量。具体说就是在其中一个c文件中定义一个全局变量key,然后在另一个要使用key这个变量的c文件中使用extern关键字声明一次,说明这个变量为外部变量,是在其他的c文件中定义的全局变量。请注意我这里的用词:定义和声明。例如在main.c文件中定义变量key,在common.c文件中声明key变量为外部变量,这样这两个文件中就能共享这个变量key了。

(1)main.c文件

#include "common.h"

unsigned char key;

(2)common.c文件:

#include "common.h"

extern unsigned char key;

其实就是变量定义变量声明的区别,变量定义使用“数据类型+变量名称”的形式,编译器需要给他分配内存单元的;而变量声明使用“extern 变量类型+变量名称”的形式,是告诉编译器我这个变量将在其他外部c文件中定义,我这里只是在外部用它。编译器就不给他分配内存空间,而等到真正遇到变量定义的时候再给他分配内存空间。

*** Using Compiler 'V5.06 update 5 (build 528)', folder: 'D:\Keil_v5\ARM\ARMCC\Bin' Build target 'APP' compiling main.c... linking... APP\APP.axf: Error: L6200E: Symbol rx_buf multiply defined (by usart.o and main.o). APP\APP.axf: Error: L6200E: Symbol rx_buf multiply defined (by stm32f1xx_it.o and main.o). APP\APP.axf: Error: L6200E: Symbol rx_buf multiply defined (by logic.o and main.o). APP\APP.axf: Error: L6200E: Symbol rx_buf multiply defined (by periph.o and main.o). APP\APP.axf: Error: L6200E: Symbol rx_buf multiply defined (by schedule.o and main.o). APP\APP.axf: Error: L6200E: Symbol rx_buf multiply defined (by system.o and main.o). APP\APP.axf: Error: L6200E: Symbol rx_byte multiply defined (by usart.o and main.o). APP\APP.axf: Error: L6200E: Symbol rx_byte multiply defined (by stm32f1xx_it.o and main.o). APP\APP.axf: Error: L6200E: Symbol rx_byte multiply defined (by logic.o and main.o). APP\APP.axf: Error: L6200E: Symbol rx_byte multiply defined (by periph.o and main.o). APP\APP.axf: Error: L6200E: Symbol rx_byte multiply defined (by schedule.o and main.o). APP\APP.axf: Error: L6200E: Symbol rx_byte multiply defined (by system.o and main.o). APP\APP.axf: Error: L6200E: Symbol timeout_flag multiply defined (by usart.o and main.o). APP\APP.axf: Error: L6200E: Symbol timeout_flag multiply defined (by stm32f1xx_it.o and main.o). APP\APP.axf: Error: L6200E: Symbol timeout_flag multiply defined (by logic.o and main.o). APP\APP.axf: Error: L6200E: Symbol timeout_flag multiply defined (by periph.o and main.o). APP\APP.axf: Error: L6200E: Symbol timeout_flag multiply defined (by schedule.o and main.o). APP\APP.axf: Error: L6200E: Symbol timeout_flag multiply defined (by system.o and main.o). APP\APP.axf: Error: L6200E: Symbol timeout_count multiply defined (by usart.o and main.o). APP\APP.axf: Error: L6200E: Symbol timeout_count multiply defined (by stm32f1xx_it.o and main.o). APP\APP.axf: Error: L6200E: Symbol timeout_count multiply defined (by logic.o and main.o). APP\APP.axf: Error: L6200E: Symbol timeout_count multiply defined (by periph.o and main.o). APP\APP.axf: Error: L6200E: Symbol timeout_count multiply defined (by schedule.o and main.o). APP\APP.axf: Error: L6200E: Symbol timeout_count multiply defined (by system.o and main.o). APP\APP.axf: Error: L6200E: Symbol uart_rx_complete multiply defined (by usart.o and main.o). APP\APP.axf: Error: L6200E: Symbol uart_rx_complete multiply defined (by stm32f1xx_it.o and main.o). APP\APP.axf: Error: L6200E: Symbol uart_rx_complete multiply defined (by logic.o and main.o). APP\APP.axf: Error: L6200E: Symbol uart_rx_complete multiply defined (by periph.o and main.o). APP\APP.axf: Error: L6200E: Symbol uart_rx_complete multiply defined (by schedule.o and main.o). APP\APP.axf: Error: L6200E: Symbol uart_rx_complete multiply defined (by system.o and main.o). APP\APP.axf: Error: L6200E: Symbol rx_index multiply defined (by usart.o and main.o). APP\APP.axf: Error: L6200E: Symbol rx_index multiply defined (by stm32f1xx_it.o and main.o). APP\APP.axf: Error: L6200E: Symbol rx_index multiply defined (by logic.o and main.o). APP\APP.axf: Error: L6200E: Symbol rx_index multiply defined (by periph.o and main.o). APP\APP.axf: Error: L6200E: Symbol rx_index multiply defined (by schedule.o and main.o). APP\APP.axf: Error: L6200E: Symbol rx_index multiply defined (by system.o and main.o). Not enough information to list image symbols. Not enough information to list load addresses in the image map. Finished: 2 information, 0 warning and 36 error messages. "APP\APP.axf" - 36 Error(s), 0 Warning(s). Target not created. Build Time Elapsed: 00:00:04
07-22
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

俊昭喜喜里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值