链接错误: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 ...
随机推荐
- 计算机网络学习-20180901-TCP/IP协议的五大分层
摘要:TCP/IP协议的五大分层:应用层.传输层.网络层.数据链路层.物理层(附带一个第0层物理媒介):互联网的核心,即为ip协议. TCP/IP协议的五大分层 5-应用层:获取主机中进程所产生的数据 ...
- Windows FFMPEG开发环境配置
1.去FFMPEG网站上下载Dev版本的库,里面有我们需要的头文件和lib文件,然后下载Shared版本的库,里面有我们需要的dll文件 http://ffmpeg.zeranoe.com/build ...
- 负载均衡中的session保持
什么叫负载均衡中的session保持 当我们需要做负载均衡时,服务端肯定有多台服务器,用户每次请求进来,会根据负载均衡算法被分配到某一台机器上,假设用户需要进行一段连续操作时,在第一台机器登陆后,下一 ...
- logback.xml例子
我项目中一直使用这样的模板,留档,并纪念. <?xml version="1.0" encoding="UTF-8"?> <configura ...
- Centos7修改默认网卡名(改为eth0)以及网卡启动报错RTNETLINK answers: File exists处理
安装好centos7版本的系统后,发现默认的网卡名字有点怪,为了便于管理,可以手动修改.下面对centos7版本下网卡重命名操作做一记录:1)编辑网卡信息[root@linux-node2~]# cd ...
- CDNI - RFC 6707 翻译
CDNI的相关问题陈述 概述 CDN对可缓存内容提供了许多好处:降低交付成本,提高终端用户体验,提高交付的鲁棒性.对于这些因素,CDN常 用于大规模的内容交付.因此,现有的CDN提供商正在扩大规模,许 ...
- 服务注册中心,Eureka比Zookeeper好在哪里?
著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性).A(可用性).和P(分区容错性).由于分区容错性P在分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡. 因此: Zookeep ...
- hive 表新增字段后更新分区无法显示数据
解决方案: 1.删除分区后重新跑数据 alter table drop partition(分区字段=“”): 2.新增字段运行程序后其实数据已经有了,只是查询hive的时候无法显示出来, 这个时候只 ...
- sql脚本过大,无法打开的解决方法
打开cmd命令窗口,输入如下命令: sqlcmd -S ipaddress -U user -P password -d dbname -i file 其中,ipaddress是数据库服务器ip,us ...
- 自定义Windows右击菜单调用Winform程序
U9_Git中ignore文件处理 背景 U9代码中有许多自动生成的文件,不需要上传Git必须BE Entity中的.target文件 .bak 文件 Enum.cs结尾的文件,还有许多 extand ...