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

  • 相关阅读:
    HDU 1019 Least Common Multiple GCD
    HDU 1263 水果 结构体排序
    HDU 1256 画8 模拟题
    HDU 2058 The sum problem 数学题
    VC6.0开发OCX按钮控件
    利用压缩软件制作插件安装包
    vs生成的exe程序和相关dll打包
    vs2010开发activex(MFC)控件/ie插件(一)
    vs2010开发activex(MFC)控件/ie插件(二):js传参数
    vs2010开发activex(MFC)控件/ie插件(三),js调用ocx控件的接口函数
  • 原文地址:https://www.cnblogs.com/Martin-CH/p/10508177.html
Copyright © 2020-2023  润新知