C++ 恼人的multiple definition of X链接错误

1. 错误原因

首先查了一下C&C++从源代码编译到可执行文件的过程:

1)预处理将伪指令(宏定义、条件编译、和引用头文件)和特殊符号进行处理

2)编译过程通过词法分析、语法分析等步骤生成汇编代码的过程,过程中还会进行优化

3)汇编过程将汇编代码翻译为目标机器指令的过程(.o文件,至少包含代码段和数据段)

4)链接程序将所有需要用到的目标代码(变量函数或其他库文件等)装配到一个整体中(可分为静态链接和动态链接)

前三个步骤总称为编译过程,第四个步骤为链接过程,这就是我们通常说的编译+链接。

问题分析:预处理程序将include头文件的内容包含进源文件,这个过程完成后,头文件就没用了,然后就由编译程序和汇编程序分别对预处理后的源文件a.c, b.c, …生成目标代码.o文件a.o, b.o, …,然后由链接程序装配所有生成的.o文件为可执行文件,问题出在这里,如果在头文件中定义了变量(是定义不是声明),并分别在a.c和b.c中进行了引用,编译过程中这个变量的符号会同时包含在a.o和b.o中,导致链接失败,原因是C语言规定“一个变量可以多次声明但只能定义一次”,解决办法是在头文件中加上#ifndef X条件编译,使该变量只定义一次,但是这里又有一个问题,该解决办法只适用C而不适用C++,在C++中,即使在头文件中加了#ifndef X,链接错误同样会发生,原因是C++中#ifndef X的作用域仅在单个文件中,因此只要在.h中定义了变量并在不同.cpp中进行引用,链接时都会报重定义错误,再说得直白点,a.cpp和b.cpp都引用了条件编译的g.h,g.h的条件编译只能分别保证在a.cpp和b.cpp中不出现重复定义,但在链接a.o和b.o的过程中就会发现重复定义。

解决方案:在申明和定义变量时添加static 前缀即可。(针对我个人的具体情况)

详细解决方案请参考附件链接。

参考连接:

https://www.cnblogs.com/edwardcmh/archive/2013/06/09/3129364.html

猜你喜欢

转载自blog.csdn.net/qcxyliyong/article/details/84938448