`

C++主流预处理,编译和链接过程

    博客分类:
  • C++
 
阅读更多
在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++开发者很有帮助。 一、前言 长久以来,我一直很不清楚obj文件的内容到底是什么,有人说是汇编,有人说是机器...

    编译软件notexp

    notexp可能与Visual Studio、Eclipse、IntelliJ IDEA等主流IDE无缝集成,提供快捷的编译和调试功能,提升开发效率。 考虑到标签“tag,tag,tag”,虽然具体信息未给出,但可以推测notexp可能具有某些特定的特性和...

    清华大学 C++教学课件

    10. **编译与链接**:了解C++的编译过程,包括预处理、编译、汇编和链接,有助于解决编译错误和优化程序性能。 通过清华大学的C++教学课件,学习者将不仅能够深入理解上述知识点,还能接触到实际案例和练习,从而...

    GCC编译原理

    它不仅支持C、C++、Objective-C等主流语言,还涵盖了Ada、Fortran、Go、Java等其他语言。GCC在开源社区和商业领域都得到了广泛的应用,是现代软件开发不可或缺的一部分。 #### 编译过程详解 GCC的编译过程可以分为...

    adv-c-cpp-compiling.rar

    这意味着读者可以了解到在不同操作系统环境下编译和链接的差异,例如在Windows上使用Visual Studio与在Linux上使用GCC的异同。 5. **实践应用**:除了理论知识,书中还会提供实际案例,指导读者如何在真实项目中...

    gcc入门教程.docx

    因此,通常建议使用G++进行C++程序的编译和链接。但这并不意味着C++程序只能用G++编译,通过指定`-lstdc++`选项,GCC也能完成链接。 3. `__cplusplus`宏的定义与GCC或G++无关,而是由编译器根据编译的语言类型来...

    2010年各大公司校园招聘笔试题 c/c++

    12. **编译与链接**:源代码到可执行文件的过程,静态库与动态库的区别。 通过深入学习和理解这些知识点,并结合提供的面试题和笔试题进行实践,求职者可以在面试中展示出扎实的编程基础和问题解决能力,增加获得...

    C++多核高级编程中文高清版.zip

    C++是一种静态类型的、编译式的、通用的、大小写敏感的、不仅支持过程化编程,也支持面向对象编程的程序设计语言。其高级编程的概念通常包括模板元编程、智能指针、STL(标准模板库)、RAII(资源获取即初始化)等...

    gcc编译命令

    GCC的编译过程可以分为四个主要阶段:预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)以及链接(Linking)。下面将逐一介绍每个阶段的作用及其对应的gcc命令。 ##### 2.1 预处理(Preprocessing)...

    EWARM 编译解析

    "EWARM编译解析.doc"文档则可能侧重于深入讲解编译过程中的一些细节,如编译选项的设置、优化技术的应用、错误和警告的处理等,帮助开发者更深入地理解和掌握EWARM的编译系统。 **六、IAR文档的重要性** IAR官方...

    g++4.4.4-14ubuntu5-i386

    一旦安装完成,开发者就可以使用g++命令行工具来编译和链接C++程序,例如: ```bash g++ -o my_program my_program.cpp ``` 这行命令会将my_program.cpp源文件编译并链接成名为my_program的可执行文件。此外,g++...

    Fast Neural Machine Translation in C++.zip

    《C++实现快速神经机器翻译技术详解》 ...然而,值得注意的是,C++虽然高效,但在某些方面可能不如Python便捷,因此在实际项目中,开发流程往往结合Python进行数据预处理和模型设计,然后用C++进行高性能的推理和部署。

    JAVA和c与C++的区别

    ### JAVA、C与C++的区别:面向对象与面向过程的较量 #### 1. 指针与内存管理 在C/C++中,指针是一个强大的特性,它允许程序员直接控制内存,但也容易引发诸如悬挂指针、内存泄漏等安全问题。相比之下,Java摒弃了...

    GCC编译器part1

    例如,对于由foo1.c和foo2.c两个源文件组成的程序,只需使用`gcc foo1.c foo2.c -o foo`即可完成编译和链接,生成可执行程序foo。然而,在大规模项目中,为提高编译效率,推荐分阶段编译,即先分别编译各源文件为...

    Linux多线程服务端编程:使用muduo C++网络库

    《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...

    C++学习笔记.doc

    - **平台环境**:介绍 C++ 在不同操作系统中的应用情况,主要提到了 Windows、Linux 和嵌入式系统这三个主流领域。 #### 二、C++旅行世界必备物品 - **1. C++程序组成** - **预编译指令**:例如 `#include "stdafx...

    C语言编译器

    2. **Borland C++**:Borland公司出品的编译器,以其快速编译和小体积著称,常用于Borland C++Builder等开发工具中。 3. **GNU C++ (GCC)**:GNU项目中的开源编译器,广泛应用于类UNIX系统,具有良好的可移植性和跨...

    用opencv的dnn模块实现人脸口罩检测包含C++和Python两种版本的实现源码+模型+说明.zip

    总之,这个项目提供了使用OpenCV DNN模块进行人脸口罩检测的完整解决方案,涵盖了C++和Python两种主流编程语言,对于想要涉足计算机视觉和深度学习领域的开发者来说,是一个非常实用的学习和实践案例。通过深入研究...

Global site tag (gtag.js) - Google Analytics