问题解决: multiple definition of XXX

在编译程序的时候,遇到了一个问题,花点时间记录一下:

在Qt中创建一个类后,一般是先在.h文件中声明变量与函数,然后在对应的.cpp文件中对各个函数进行定义,这在往常使用中没有任何问题,今天在使用Qt时,在各.cpp源文件编译时出现了许多multiple definition of XXX的错误。

搜寻了网上一些资料,总算是解决multiple definition of 的方法:

问题解决方法之一:

根据网上的解释,multiple definition of 原因是因为在多次包含global.h时重复定义了变量和函数。问题是检查过程序后,发现并不存在重复定义的变量和函数,在一条论坛评论中尝试了一种简单粗暴的方法……以Qt项目为例,在项目的Debug文件夹中找到编译时生成的o文件,如:

c和c++编译.c,cpp文件,每个文件都生成.o文件,再把所有的.o文件链接成最后的执行程序,若o文件有问题,是无法生成执行文件的。将已存在的o文件删除之,重新编译并生成新的o文件,结果在没有其他问题的情况下成功生成执行程序。(我就是属于这种情况…在确认代码中已无明显错误时可以一试)

问题解决方法之二:

当多个文件包含同一个头文件时,并且你的.h文件里面没有加上条件编译。

而当多个文件包含同一个头文件时,而头文件中没有加上条件编译,就会独立的解释,然后生成每个文件生成独立的标示符。在编译器连接时,就会将工程中所有的符号整合在一起,由于,文件中有重名变量,于是就出现了重复定义的错误。

给每一个头文件加上条件编译,避免该文件被多次引用时被多次解释,这是个应该是习惯。这个方法会解决大部分低级问题。在创建Qt类时已默认生成条件编译:

#ifndef TEST_H
#define TEST_H
......
#endif

就会独立的解释,然后生成每个文件生成独立的标示符。在编译器连接时,就会将工程中所有的符号整合在一起,由于,文件中有重名变量,于是就出现了重复定义的错误。

因此可以给每一个头文件加上条件编译,避免该文件被多次引用时被多次解释,这是个应该是习惯。这个方法会解决大部分低级问题。

问题解决方法之三:

当以上方法无效时,可以把所有的全局变量放入一个头文件 global.h (名字随意起,但要加条件编译)中,每一个变量前面加extern,声明一下这些变量将在其它文件中定义。 然后建立一个和头文件名字对应的.c or .cpp文件 如global.c。在里面声明所有的全局变量。例如:void(*Handl_Display)();

然后,让涉及到全局变量的文件include ”global.h“。这样编译时,会先对global.c编译生成一个global.o ,然后再和其它文件的.o链接生成可执行文件。

在一篇文章: http://blog.csdn.net/wu070815/article/details/8781762 中提到的另一种解决方法:

在变量前加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变化。
时间: 2024-10-13 12:37:06

问题解决: multiple definition of XXX的相关文章

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

内容借鉴 于CSDN炸鸡叔 错因 截图: “multiple definition of  'head' ” “multiple definition of  'tail' ” 解决过程: 1.首先要  区别  变量的定义 和 声明 声明是向 编译器介绍名字---标识符,它告诉编译器“这个函数或变量 在哪儿可找到,模样”: 而定义是说: “在这里建立变量或函数”,即为变量或函数 分配存储空间. 对于变量,编译器确定变量的大小,然后在内存中开辟空间来保存其数据. 对于函数,编译器会生成代码,这些代

multiple definition of 问题解决方法

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

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

multiple definition of `qMain(int, char**)'

QT C++ 我上一分钟运行地好好的,下一分钟就无法通过编译了.查了半天发现在IDE自动生成的项目文件.pro中 main竟然包含了两遍.我对这表示很无语,我完全是通过IDE来操作,却产生一些我不易察觉的问题.所以我不信任IDE,也一直找不到一款得心应手的IDE SOURCES += main.cpp mainwindow.cpp main.cpp mainwindow.cpp HEADERS += mainwindow.h mainwindow.h multiple definition of

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

Linux C++编译报错:"multiple definition of" / "does not name a type"

最近编译larbin_daemon爬虫服务器端管理程序时,总是会报如下的错误: g++ -c -o editConf.o editConf.cpp editConf.cpp:49:8: error: redefinition of 'std::string projectG' editConf.h:34:8: error: 'std::string projectG' previously declared here editConf.cpp:50:8: error: redefinition

Linux下,连接器ld链接顺序的总结

原来ld对于链接一系列的库的顺序是很敏感的,不然会报undefined referenced 的函数符号错误,意思就是未找到函数定义.实际上库是能正确打开的.如果库libA.a依赖于库libB.a,那么连接器的参数应该ln -lA -lB,   必须这样写.不然就会错误. 这个看来是历史的遗留问题.说白了就是,如果你确定某个库不重要,就放到最后,也就是说,库的加载顺序是按顺序进行的,从左到右,优先级最高,这也是远古时代机器太破的原因,内在和硬盘包括CPU都是极其稀罕珍贵的.所以要你提前搞定哪些需

c a header file realize of multiple .c file

//I write a few variables declaration,then include this head-file in multiple realization-c-file,then appear "multiple definition of 'var1 ' " error resolution: exists-file:myhead.h,realize1.c,realize2.c,main.c add:myhead.c 1.move the defintion-

iOS12适配及兼容问题解决,xcode10问题

1.Multiple commands produce 'xxx/Info.plist'2.iOS 12系统WiFi获取SSID(wifi名称)和BSSID(mac地址)失败3.Xcode 10中#import的时候闪退或导入头文件不提示4.[Xcode 10] library not found for -lstdc++.6.0.95.[iOS 12.1] 二级页面返回时tabbar图标和文字位置偏移6.webView播放视频返回后状态栏消失7.[iPhone X]StatusBar内部结构改