在C++的程序的编写过程中,基本上都碰到过LNK2005的错误吧,下面就针对这个问题详细分析:
首先,预处理阶段:
这一过程,主要针对#include和#define进行处理,具体过程如下:
对于cpp文件中经常会出现#include来包含某个头文件,在进行预处理之后,所有的#include命令都将替换成该头文件中的详细内容,如果该头文件中还包含另外的头文件,采用同样的方法进行递归处理。同样#define亦是如此,对用它进行宏定义的字符进行替换,这里就是简单的替换。所以整个预处理过程就是进行简单的替换。
其次,预编译过程
这一过程主要针对预处理之后的cpp文件编译称为obj文件,即目标文件(注意,在这里仅仅是针对cpp文件,对头文件是不做任何处理的,所以在多文件工程中定义全局变量的时候,我们一定要记得把全局变量定义在cpp文件中,因为如果定义在头文件中,我们要使用该变量的话很容易出现already define的错误)。主要是通过编译器和汇编器生成二进制文件,便于链接处理。
对于这个,我给个实例和其解释:
在链接的过程中,用extern申明的变量,我们很明确的知道这是一个外部变量,那么对于此,连接器会到外部的obj文件中区寻找该变量,如果说是我们在该obj文件编译的cpp中有该变量的定义的话,那么这就不是一个声明了,而是一个定义。所以,我们的这个obj文件编译的源文件cpp,千万不要包含有该变量定义的头文件或者cpp文件,否则就是重定义,也就是说有些重定义是在链接的时候才会确定的一个错误,所以最好是在.h文件中用extern进行声明,然后再随便一个cpp文件中进行定义。在你想要使用该变量的cpp文件中只需要包含该头文件即可。
第三,链接过程
如果写程序中没有足够的警觉,在这个过程中极易出现链接错误。首先该过程主要是将众多的obj文件生成exe文件。
分享到:
相关推荐
C++编译预处理,关于C++学习的课件,可以帮助C++的学习
C++图像预处理及数字识别源代码,适合学生
c c++基础 预处理指令总结 魔鬼作坊学辅助制作 moguizuofang.com
里面包含了编译链接时,编译器和链接器是如何工作的,并举例说明,还有目标文件及可执行文件的文件格式等内容。
编译原理程序实例,实现预处理(删除多余空格、回车以及注释),C++源代码
本资源是TensorFlow C++ API顺利编译和测试的过程,为线上使用TensorFlow C++ API的使用打下基础 2、Linux环境下编译TensorFlow C++ API生成的动态链接库:libtensorflow_cc.so,libtensorflow_framework.so。
需自己编译的版本c++版本gdal,提供gdal3版本必须的proj和sqlite库。可根据该版本进行编译,编译方法链接:https://blog.csdn.net/wenming111/article/details/100887730
Dev-C++是可视化集成开发环境,可以实现C/C++程序的编辑、预处理、编译、链接、运行和调试。启动Dev-C++环境可以通过两种方法:一是从“开始”菜单中选择“程序”菜单项,然后选择“Bloodshed Dev-C++”项;二是直接...
反编译软件,可将动态链接库反编译回c/c++
C与C++程序编译链接全过程解析
C++反编译工具,用来显示与一个可执行文件(exe或者dll)相关的依赖项(dll),以及该exe或dll引用了这些dll中的哪些接口。
DLL反编译(C++)工具
poco c++ 在linux环境下可编译使用: 过程: 解压 编译 安装
学习c++过程中的一个实验,帮助其他人更好理解编译预处理的过程
C++开发语言源代码反编译工具
加快C++Builder6编译速度加快C++Builder6编译速度加快C++Builder6编译速度加快C++Builder6编译速度
Visual C++ 编译链接信息手册,从看雪上面下载的,先共享下吧,比较适合C++编译出问题的解决。
C++全套学习课件编译预处理.pdf