编译的整个过程:预编译、编译、汇编、链接

编译分为四个步骤:
每个步骤将文件编译成别的格式,如下:

步骤 未编译 预编译 编译 汇编 链接
文件 fun.h、fun.cpp、test.cpp fun.i、test.i fun.s、test.s fun.o、test.o projectname.exe

详解
1.预编译

预编译过程主要做4件事:
①展开头文件
在写有#include <filename>#include "filename"的文件中,将文件filename展开,通俗来说就是将fiename文件中的代码写入到当前文件中;
②宏替换
③去掉注释
④条件编译
即对#ifndef #define #endif进行判断检查,也正是在这一步,#ifndef #define #endif的作用体现出来,即防止头文件被多次重复引用

2.编译

将代码转成汇编代码,并且在这个步骤中做了两件很重要的工作:
编译器在每个文件中保存一个函数地址符表,该表中存储着当前文件内包含的各个函数的地址
②因为这步要生成汇编代码,即一条一条的指令,而调用函数的代码会被编译成一条call指令,call指令后面跟的是jmp指令的汇编代码地址,而jmp指令后面跟的才是“被调用的函数编译成汇编代码后的第一条指令”的地址,但是给call指令后面补充上地址的工作是在链接的时候做的事情。

3.汇编

将汇编代码转成机器码

4.链接

编译器将生产的多个.o文件链接到一起生成一个可执行.exe文件;
但是在这个过程中,编译器做的一个重要的事情是将每个文件中call指令后面的地址补充上;方式是从当前文件的函数地址符表中开始找,如果没有,继续向别的文件的函数地址符表中找,找到后填补在call指令后面,如果找不到,则链接失败。

猜你喜欢

转载自blog.csdn.net/w_y_x_y/article/details/80309416
今日推荐