编译的几个过程

我们经常会使用很多的继承开发环境,也有时候称为是编译器,但是我们经常听到的编译实际上包含很多的步骤,大致可以分为以下几个过程:预处理、编译、汇编、链接。下面我们以c++的编译过程作为例子进行解释。

1、预处理

预处理的过程简单的来说就是对所有的预处理命令进行简单的程序上的叠加,比如有**#include头文件、#define宏定义**,编译器在进行编译时首先会把该这些内容简单的叠加至所需编译的程序的开头,同时做出以下几个处理:

  1. 删除注释 ,我们知道注释不参与编译的过程,在这一步就已经将其删掉;
  2. 展开宏定义#define
  3. 展开头文件#include
  4. 添加行号,以及所需要的其他的标识符

demo:

1.首先创建一个c++源文件,这里我们使用记事本创建helloWorld.cpp,源代码如下:

#include <iostream>
using namespace std;
int main()
{
    cout<<"HelloWorld"<<endl;
    return 0;
}

我们使用的是MinGw编译器,进行预处理:

输入命令行:g++ -E helloWorld.cpp -o helloWorld.i ,这意味着在输入命令后会生成 .i 文件,如下:

先编译java还是kotlin 先编译还是先组建_预处理、编译、汇编、链接


以及生成.i 文件:

先编译java还是kotlin 先编译还是先组建_MinGw编译的过程_02


至于生成的.i 文件内容,我们就不打开仔细分析了,因为是不太好理解。

2、编译

编译就是成成汇编语言的过程,编译后的文件保存为.s 文件,这个文件我们可以打开看一下,应该是可以看懂的,具体的操作如下:

首先输入命令行:g++ -S helloWorld.i -o helloWorld.s ,这意味着在输入命令后会生成 .s 文件,如下:

先编译java还是kotlin 先编译还是先组建_先编译java还是kotlin_03


以及生成.s 文件:

先编译java还是kotlin 先编译还是先组建_编译的过程_04


现在我们打开.s 文件:(我们可以看到是汇编语言)

先编译java还是kotlin 先编译还是先组建_先编译java还是kotlin_05

3、汇编

将汇编指令转换为机器代码的过程,生成二进制文件,具体操作如下:

首先输入dos指令:g++ -c helloWorld.s -o helloWorld.o ,这意味着在输入命令后会生成 .s 文件,如下:

先编译java还是kotlin 先编译还是先组建_编译的过程_06


以及生成的.o 文件:(这个文件不用去管,只是生成的二进制文件)

先编译java还是kotlin 先编译还是先组建_MinGw编译的过程_07

4、链接

这是编译的最后一步,见名知意,就是链接的过程,链接的是库文件,将生成的目标文件转化为可执行文件(.exe),具体操作如下:

首先输入dos指令:*g++ helloWorld.o -o helloWorld.exe * ,这意味着在输入命令后会生成 .exe 文件,如下:

先编译java还是kotlin 先编译还是先组建_预处理、编译、汇编、链接_08


以及生成的.exe文件:

先编译java还是kotlin 先编译还是先组建_Visual Stdio_09

5、运行可执行文件

生成的.exe文件可以直接运行,双击图标或者输入命令:helloWorld .exe ,运行结果如下:

先编译java还是kotlin 先编译还是先组建_编译的过程_10


至此,整个编译过程结束,还想要说明的一点就是在一些IDE(继承开发环境)中,比如Visual Stdio ,我们可能不会亲自输入命令分别进行上述步骤,但是当我们点击编译的时候,IDE是默认的顺序执行上述的几个步骤(不包括执行)。