链接错误: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' 问题解决及其原理的更多相关文章
- multiple definition of XXX情况分析
近日在写代码,各个.cpp源文件编译时没有问题,将*.o进行链接时,出现了许多multiple definition of XXX的链接错误.于是在网上搜索了一番,结合自己的代码包含逻辑,最终发现了问 ...
- [err]multiple definition of `***'
err CMakeFiles/dsm.dir/src/main_stateEstimation.cpp.o: In function `align_mean(cv::Mat, cv::Rect_< ...
- multiple definition of 问题解决方法
在最近的项目里,由于我想重载结构体的==操作符,然而大意的我把重载的过程写在了头文件里,所以导致了multiple definition of的错误.现在总结下解决方法: 首先,最关键的,不要把全局变 ...
- QT编译错误: multiple definition of `qMain(int, char**)'
QT使用过程中来回添加修改代码,结果出现了编译错误:error: multiple definition of `qMain(int, char**)' 一直看我的源文件是都哪里有错误,最后发现是在p ...
- C++常见gcc编译链接错误解决方法
除非明确说明,本文内容仅针对x86/x86_64的Linux开发环境,有朋友说baidu不到,开个贴记录一下(加粗字体是关键词): 用“-Wl,-Bstatic”指定链接静态库,使用“-Wl,-Bdy ...
- gcc: multiple definition of [转]
/home/tace/openav/source/SeamlessMessage/CPaoFlt.o: In function `CPaoFlt::get_m_strPrmair() const':C ...
- 解决 multiple definition of
总结了解决multiple definition of的方法: 问题原因: 当多个文件包含同一个头文件时,并且你的.H里面没有加上条件编译#ifndef TEST_H#define TEST_H ...
- C++ "multiple definition of .. first defined here"
C++ "multiple definition of .. first defined here" 在C++中,有时候需要在不同文件中使用同一个变量.对于这类变量如果处理不当,很 ...
- multiple definition of
总结了解决multiple definition of的方法: 问题原因: 当多个文件包含同一个头文件时,并且你的.H里面没有加上条件编译#ifndef TEST_H#define TEST_H ...
随机推荐
- 弹框时(如大于body的高度),锁死body,使其不能滚动
if(flag){ document.body.style.height = '100vh' document.body.style['overflow-y'] = 'hidden' }else{ d ...
- ORACLE数据库自动备份压缩的批处理脚本 rar 7z
使用7z的版本: @echo offset filename="d:\backup\dbname_%date:~0,10%"set zipfile="d:\backup\ ...
- Windows FFMPEG开发环境配置
1.去FFMPEG网站上下载Dev版本的库,里面有我们需要的头文件和lib文件,然后下载Shared版本的库,里面有我们需要的dll文件 http://ffmpeg.zeranoe.com/build ...
- js-语法
js中slice方法(转) 1.String.slice(start,end)returns a string containing a slice, or substring, of string. ...
- 对话框--pop&dialog总结
pinguo-zhouwei/CustomPopwindow:(通用PopupWindow,几行代码搞定PopupWindow弹窗(续)): 1,通用PopupWindow,几行代码搞定PopupWi ...
- FuzzScanner 信息收集小工具
前言: 该工具集成了各种大牛的工具,比如子域名发现,目录扫描,nmap端口扫描,c段地址查询,端口指纹,以及waf查询 00X1: 安装不推荐git安装,首先直接githup脱下来:git clone ...
- Monkey相关参数 笔记
Monkey相关参数 笔记 Monkey是Android系统自带的一个命令行工具,可运行在模拟器里或实际设备中. Monkey可以向被测试的应用程序发送伪随机的用户事件流(如按键.触屏.手势等),实 ...
- eclipse修改android项目的apk包名类名
在Google提供的Eclipse集成开发环境adt-bundle下修改名称的总结: 1. 修改工程名(apk名称) 在弹出的对话框中输入新名称 该操作实际上是修改<project&g ...
- [java,2019-01-28] 枪手博弈,谁才是最后赢家
什么是枪手博弈: 枪手博弈指彼此痛恨的甲乙丙三个枪手准备决斗.甲枪法最好,十发八中.乙枪法次之,十发六中.丙枪法最差,十发四中.假设他们了解彼此实力,也能做出理性判断. 问题一:如果三人同时开枪,并且 ...
- Oracle数据库中OVER()函数的了解
1.over函数介绍: 开窗函数,Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行. ...