美文网首页
c/c++编译过程

c/c++编译过程

作者: 王王王王王景 | 来源:发表于2019-08-18 09:58 被阅读0次

1、一个C++源文件从文本到可执行文件经历的过程

预处理-->编译-->汇编-->链接


1.1预处理(产生.i文件 g++ -E)

将代码编译为.i文件,主要是针对于#号的相关处理,例如将#define在代码中展开(进行替换)、将需要包含的文件插入到预编译指令的位置、去除#ifdef之类的、去除注释。

首先是源代码文件helloworld.cpp和相关头文件预处理成一个.i文件。命令如下g++ -E helloworld.cpp -o helloworld.i预处理的过程主要处理那些源代码文件中只能够以“#”开始的预处理指令,主要规则如下:

  • 将所以#define删除,并将宏定义展开
  • 处理一些条件预编译指令如#ifndef,#ifdef,#elif,#else,#endif等。将不必要的代码过滤掉。
  • 处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。这个过程是递归进行的,因为被包含的文件可能也包含其他文件。
  • 预处理过程还会过滤掉所有注释/**/和//里面的内容。
  • 另外还会添加行号和文件名标识。
  • 最后会保留#pragma编译器指令,因为编译器需要使用它们。

1.2 编译(产生.s文件,g++ -s)

编译就是将预处理的文件进行一系列的词法分析,语法分析,语义分析,以及优化后产生相应的汇编代码文件,这个过程是程序构建的核心部分,也是最复杂的。执行命令(-s)如下:

g++ -S helloworld.i -o helloworld.s

可以使用vi/vim查看相应的汇编代码。在这个过程中又分为六步:词法分析,语法分析,语义分析,源代码优化,代码生成和目标代码优化。具体过程请参照《编译原理》。

1.3 汇编(产生.o或.obj文件,-c)

汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程,即生成目标文件。对于被翻译系统处理的每一个C语言源程序,都将最终经过这一处理而得到相应的目标文件。目标文件中所存放的也就是与源程序等效的目标的机器语言代码。目标文件由段组成,通常一个目标文件中至少有两个段:

  • 代码段:该段中所包含的主要是程序的指令。该段一般是可读和可执行的,但一般却不可写。

  • 数据段:主要存放程序中要用到的各种全局变量或静态的数据。一般数据段都是可读,可写,可执行的。

UNIX环境下主要有三种类型的目标文件:

  • 可重定位文件:其中包含有适合于其它目标文件链接来创建一个可执行的或者共享的目标文件的代码和数据。

  • 共享的目标文件:这种文件存放了适合于在两种上下文里链接的代码和数据。第一种事链接程序可把它与其它可重定位文件及共享的目标文件一起处理来创建另一个目标文件;第二种是动态链接程序将它与另一个可执行文件及其它的共享目标文件结合到一起,创建一个进程映象。

  • 可执行文件:它包含了一个可以被操作系统创建一个进程来执行之的文件。

汇编程序生成的实际上是第一种类型的目标文件。对于后两种还需要其他的一些处理方能得到,这个就是链接程序的工作了。

1.4 链接(产生.out或.exe文件,-o)

链接就是把每个源代码独立编译后的结果,然后按照它们的要求将它们组装起来,链接主要解决的是源代码之间的相互依赖问题,链接的过程包括地址和空间的分配,符号决议,和重定位等这些步骤。最基本的静态链接如图所示:

相关文章

  • iOS Runtime实用详解(一)

    基本概念 了解 C/C++编译C/C++编译就是将C/C++的代码映射到相应的机器码,编译过程包括几个部分分别是编...

  • 【C++】gcc编译过程

    【C++】gcc编译过程 C++编译过程主要分为,预处理、编译、汇编、链接四个过程。如下图所示: 第一步:预处理 ...

  • C++编译过程

    C++ 编译过程在介绍编译器之前,先简单地说一下 C++ 的编译过程,以便理解编译器的工作。编译(compilin...

  • C++的编译总结

    一、C++编译过程概述 不管是Linux系统还是Windows系统,C++源文件的编译流程都是一样的,只是编译过程...

  • Unreal 如何编译C++

    1. C++编译 (1)C++编译后生成的文件 以下对生成文件的常见文件进行说明 (2.)C++编译过程 2. U...

  • java编译过程

    1、java编译过程与c/c++编译过程不同java编译程序将java源程序编译成jvm可执行代码--java字节...

  • 【C/C++】编译过程

    编写的C/C++源代码无法直接运行,需要转换成机器可以理解的可执行目标文件才能执行,这个转换的过程叫做编译与链接。...

  • c/c++编译过程

    1、一个C++源文件从文本到可执行文件经历的过程 预处理-->编译-->汇编-->链接 1.1预处理(产生.i文件...

  • C++ 编译过程

    编译的作用 读取源程序(.cpp),进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再转换为机器代码...

  • 3、node的核心模块

    JavaScript核心模块的编译过程; 在编译所有C/C++文件之前,编译程序需要将所有的JavaScript模...

网友评论

      本文标题:c/c++编译过程

      本文链接:https://www.haomeiwen.com/subject/orfrsctx.html