multiple definition of 问题解决方法

项目场景:

物联网开发板例程源码

使用WIN Cude IDE1.9版本出现同样的文件下,编译在WIN Cude IDE1.8版本不会出现的问题

./icode/can/can1.o:C:/Users/93254/Desktop/IOT32/Debug/../icode/can/can1.c:12: multiple definition of `hcan'; ./Core/Src/main.o:C:/Users/93254/Desktop/IOT32/Debug/../Core/Src/main.c:57: first defined here


问题描述

multiple definition of的错误

/code/can/can1.c:12: multiple definition of `hcan'; 

原因分析:

就是在 原来的.h文件中将 CAN_HandleTypeDef hcan;//声明的HAL库结构体 前加extern,之后的 extern CAN_HandleTypeDef hcan声明放在.c文件中。


解决方案:对于 multiple definition of

1.给每一个头文件加上条件编译:

2.使用extern定义全局变量

3.使用Static修饰:

1.给每一个头文件加上条件编译:
注:此方法不是解决上述问题的方法,只是解决multiple definition of的一个方法。
当多个文件包含同一个头文件时,而头文件中没有加上条件编译,就会独立的解释,然后生成每个文件生成独立的标示符。在编译器连接时,就会将工程中所有的符号整合在一起,由于,文件中有重名变量,于是就出现了重复定义的错误。 
给每一个头文件加上条件编译,避免该文件被多次引用时被多次解释,这是个应该是习惯。这个方法会解决大部分低级问题。
条件编译示例
#ifndef TEST_H
#define TEST_H
……
#endif

2.使用extern定义全局变量:
可以把所有的全局变量放入一个头文件 global.h (名字随意起,但要加条件编译)中,每一个变量前面加extern,声明一下这些变量将在其它文件中定义。 然后建立一个和头文件名字对应的.c or .cpp文件 如global.c。在里面声明所有的全局变量。例如:void(*Handl_Display)();
然后,让涉及到全局变量的文件include ”global.h“。这样编译时,会先对global.c编译生成一个global.o ,然后再和其它文件的.o链接生成可执行文件。
简单一点说,就是在变量前加extern,之后变量的声明放在.c中。

3.使用Static修饰:
在变量前加static,声明成静止变量。
这个方法虽然可以解决multiple definition的问题,但是却会引发其他问题。
问题如下:
三个文件,a.h,a.c,b.c;
在a.c和b.c 都include了a.h。
在b.c中调用a.c中的函数对a.h中的变量进行赋值,但事实上b.c中的变量仍没被赋值。
问题分析:
static的含义是迫使那个变量只在某个文件可见。 
假定你在头文件定义static x; 
且这个头文件分别被a.c和b.c包含;
实质是在a.c和b.c里会分别定义一个名字叫x的变量,两个x毫无关系。
在a.c里修改x,他不会导致b.c里的x变化.

multiple definition of 问题解决方法 - Boblim - 博客园 (cnblogs.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值