一个C++源文本从文本到可执行程序的过程(预处理,编译,汇编,链接)

136 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情

一个C++源文本从文本到可执行程序的过程(预处理,编译,汇编,链接)

预处理:对所有的define进行宏替换;处理所有的条件编译#idef;处理#include指令;删除注释等。

编译:将预处理后的文件进行词法分析、语法分析、语义分析以及优化相应的汇编文件

汇编:将汇编文件转换成机器能执行的代码

连接:包括地址和空间分配,符号决议和重定位

  1. 预编译:这个过程主要的处理操作如下:(1) 将所有的#define删除,并且展开所有的宏定义(2) 处理所有的条件预编译指令,如#if、#ifdef(3) 处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。(4) 过滤所有的注释(5) 添加行号和文件名标识。
  2. 编译:这个过程主要的处理操作如下:(1) 词法分析:将源代码的字符序列分割成一系列的记号。(2) 语法分析:对记号进行语法分析,产生语法树。(3) 语义分析:判断表达式是否有意义。(4) 代码优化:(5) 目标代码生成:生成汇编代码。(6) 目标代码优化:
  3. 汇编:这个过程主要是将汇编代码转变成机器可以执行的指令。
  4. 链接:将不同的源文件产生的目标文件进行链接,从而形成一个可以执行的序。链接分为静态链接和动态链接。静态链接,是在链接的时候就已经把要调用的函数或者过程链接到了生成的可执行文件中,就算你在去把静态库删除也不会影响可执行程序的执行;生成的静态链接库,Windows下以.lib为后缀,Linux下以.a为后缀。而动态链接,在链接的时候没有把调用的函数代码链接进去,而是在执行的过程中,再去找要链接的函数,生成的可执行文件中没有函数代码,只包含函数的重定位信息,所以当你删除动态库时,可执行程序就不能运行。生成的动态链接库,Windows下以.dll为后缀,Linux下以.so为后缀。 111