链接错误: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)。

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

原文地址:https://www.cnblogs.com/Martin-CH/p/10508177.html

时间: 2024-10-13 15:07:08

链接错误:multiple definition of 'xxx' 问题解决及其原理的相关文章

问题解决: multiple definition of XXX

在编译程序的时候,遇到了一个问题,花点时间记录一下: 在Qt中创建一个类后,一般是先在.h文件中声明变量与函数,然后在对应的.cpp文件中对各个函数进行定义,这在往常使用中没有任何问题,今天在使用Qt时,在各.cpp源文件编译时出现了许多multiple definition of XXX的错误. 搜寻了网上一些资料,总算是解决multiple definition of 的方法: 问题解决方法之一: 根据网上的解释,multiple definition of 原因是因为在多次包含global

multiple definition of 问题解决方法

在最近的项目里,由于我想重载结构体的==操作符,然而大意的我把重载的过程写在了头文件里,所以导致了multiple definition of的错误.现在总结下解决方法: 首先,最关键的,不要把全局变量以及全局方法的定义放在头文件里!!!! 1.给每一个头文件加上条件编译:注:此方法不是解决上述问题的方法,只是解决multiple definition of的一个方法.当多个文件包含同一个头文件时,而头文件中没有加上条件编译,就会独立的解释,然后生成每个文件生成独立的标示符.在编译器连接时,就会

undefined reference to `clock_gettime' 链接错误问题解决

当你编译程序时, 碰到下面的链接错误, timeval.c:(.text+0x6f): undefined reference to `clock_gettime' 则你只需要在你的Makefile文件里面添加    -lrt  ,重新编译即可. undefined reference to `clock_gettime' 链接错误问题解决

QT编译错误: multiple definition of `qMain(int, char**)'

QT使用过程中来回添加修改代码,结果出现了编译错误:error: multiple definition of `qMain(int, char**)' 一直看我的源文件是都哪里有错误,最后发现是在pro文件中出的问题,频繁的添加以及移除文件,导致HEADERS以及SOURCES中会重复添加 解决办法:把重复项删除! QT编译错误: multiple definition of `qMain(int, char**)' 原文地址:https://www.cnblogs.com/MakeView6

gcc: multiple definition of [转]

/home/tace/openav/source/SeamlessMessage/CPaoFlt.o: In function `CPaoFlt::get_m_strPrmair() const':CPaoFlt.cpp:(.text+0x0): multiple definition of `CPaoFlt::get_m_strPrmair() const'/home/tace/openav/source/SeamlessMessage/CPaoFlt.o:CPaoFlt.cpp:(.text

C++常见gcc编译链接错误解决方法

除非明确说明,本文内容仅针对x86/x86_64的Linux开发环境,有朋友说baidu不到,开个贴记录一下(加粗字体是关键词): 用“-Wl,-Bstatic”指定链接静态库,使用“-Wl,-Bdynamic”指定链接共享库,使用示例:-Wl,-Bstatic -lmysqlclient_r -lssl -lcrypto -Wl,-Bdynamic -lrt -Wl,-Bdynamic -pthread -Wl,-Bstatic -lgtest("-Wl"表示是传递给链接器ld的参数

关于error LNK20xx的链接错误

引子 使用VS编译C++程序经常会遇到这种情况:编译已经成功,没有报错:但是链接时报错,类似于:"error LNK2001!@#¥#¥@%#--@#¥%&*&¥%¥@#¥".网上查到的相关文章和我实际遇到不太一样,在这里总结一下我所遇到的链接错误的解决方式.注:这里不明确指明error LNK的错误代码. 一.没有正确的配置XXX.lib windows编译用到其他的dll库如XXX.dll,不但需要 .h的头文件,而且需要相应的 XXX.lib文件.之前查过说是这个

mysql链接错误

Warning: mysqli_connect() [function.mysqli-connect]: [2002] No such file or directory (trying to connect via unix:///var/mysql/mysql.sock) in xxx.php on line 14 解决方案: cd /var sudo mkdir mysql sudo chmod 755 mysql cd mysql ln -s /tmp/mysql.sock mysql.

Treat wchar_t as built-in type不一致导致的链接错误

今天用VS2013新建了一个工程,生成时出现很多怪异的链接错误,比如: error LNK2019: unresolved external symbol "__declspec(dllimport) public: static class MTString __cdecl MTString::fromWCharArray(wchar_t const *,int)"([email protected]@@[email protected][email protected]) refe