链接错误: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 ...
随机推荐
- .NET版本与CLR版本及兼容性
WIN7原生的.net是2.0和3.5,打开和关闭windows功能里面可以看到.另外C:\Windows\Microsoft.NET\Framework下面也能看到..net framework1. ...
- 树莓派 nfs server安装
安装服务 sudo apt-get install portmap sudo apt-get install nfs-kernel-server 配置: sudo nano /etc/expo ...
- lambda expressions
语法lambda表达式包含下面几个要素:1.逗号分隔的参数列表,如CheckPerson.test(Person p),其中p表示一个Person的对象实例 2.向右箭头 →, 箭头左侧是表达式入参, ...
- 适用于nodercms的打包构建脚本
背景 最近自己用nodercms搭建了一个简单的博客系统,用户发布一些自己谁便谢谢的文章.感谢nodercms团队,这个cms轻量易用,用于做个人博客太方便了.开发了博客系统,肯定设计到部署到AWS或 ...
- axure8.0激活
Licensee:米 业成 (STUDENT)Key:nFmqBBvEqdvbiUjy8NZiyWiRSg3yO+PtZ8c9wdwxWse4WprphvSu9sohAdpNnJK5
- 名称 ****不是有效的标识符 sql
假设存储过程:proc_test create proc proc_test @ProdID varchar(10) as begin declare @sql varchar(max) @sql = ...
- 试用 Angular v6 的 Ivy compiler
“Ivy” 是 Angular v6 的新一代渲染器.从 v6.0.0-beta.1 开始,Ivy 已经作为体验 API 发布. 作为下一代的 Angular 的视图引擎,重点在于彻底缩减代码尺寸并增 ...
- 常见26种NLP任务的练手项目
经常有人问我:老大让我完成xxx,我不会,他也不会,但是很着急.这个任务怎么实现啊?这个任务需要什么技术啊?这种情况我遇到有100+次了,而且很多时候问得问题跟具体需要的技术简直是驴唇不对马嘴.所以今 ...
- 【人工智能】从零开始学好人工智能,AI知识体系和框架
写在前面: 最近公司的业务方向开始向AI方向改变(人工智能+文娱),但是现阶段AI方面的知识还没有储备,所以作为测试,也开始学习这方面的知识,不掉队. 知识储备: 1.阶段一-高等数学 高 ...
- .net core 自动生成文档
如下图自动生成显示接口文档注释