链接错误:multiple definition of 'xxx' 问题解决及其原理

内容借鉴 于CSDN炸鸡叔

错因 截图:

“multiple definition of  'head' ”  “multiple definition of  'tail' ”

解决过程:

1.首先要  区别  变量的定义 和 声明

声明是向 编译器介绍名字---标识符,它告诉编译器“这个函数或变量 在哪儿可找到,模样”;

而定义是说: “在这里建立变量或函数”,即为变量或函数 分配存储空间。

对于变量,编译器确定变量的大小,然后在内存中开辟空间来保存其数据。

对于函数,编译器会生成代码,这些代码最终也要占用一定的内存。

总之,建立空间的声明即为“定义”, 不需要建立存储空间的即为“说明”

-------------------------------------------------------------------------------------------

2.一般在.h文件中定义个变零声明时,再在其他文件中只要包含这个.h文件, 编译时就会独立被编译器解释,

然后每个.c文件就会生成独立的标识符和符号表,所以上诉代码在单独编译时并不会报错,语法是合法的。

但是,最后在编译器链接的时候,就会将工程中所有的符号整合在一起,由于文件中有重复的变量。

于是就会出现重复定义的错误,系统就会提示:multiple definition of 'xxxx'

  进一步解释,在编译每一个.c文件时,相当于一条有管道包围的纵向水流,二者间不干扰,

当链接时两条原本独立的水管就变为横向流了,所以就出现了重复元素。所以当进行链接时就会出现重复定义的标识符。重复定义的标识符在这里只是变量,而函数不会。因为函数确实只在.c中定义了一次,多次声明是没问题的,而变量确实出现了两次定义。

两次重复的变量定义链接器就不知道该用哪个地址作为变量的内存,所以报错

-------------------------------------------------------------------------------------------------------

3.其实只需要将全局变量从.h文件中移到.c文件中,然后在.h文件中用extern做外部声明

注意在.h文件中不要对变量初始化赋值了

简单说,有两个.c文件和一个.h文件,只要在一个.c文件定义全局变量(int a),再在.h中extern做外部声明就可(extern int a)。

猜你喜欢

转载自www.cnblogs.com/Martin-CH/p/10508177.html