预处理、编译、汇编和链接

1 预处理 prepressing

预处理过程主要是处理源代码中的以“#”开始的预处理指令。

  • 删除所有的“#define”,并且炸奶所有的宏定义。
  • 处理所有有条件的预处理指令,#if #ifedf #elif #else #endif
  • 处理#include指令,将被包含的文件插入到该预处理的指令的位置,此处的文件中有可能还会包括其他的文件,这个过程会用递归的方式。
  • 删除注释
  • 添加行号以及文件名标识
  • 保留所有的#pragma编译器指令,

2 编译 compilation

编译过程就是把预处理的文件进行一系列的词法分析,语法分析,语义分析以及优化后产生相应的汇编代码文件。这个部分是最核心的部分在整个过程中

3 汇编 assembly

汇编器将汇编代码转变成机器可以执行的指令。

经过以上三步处理之后,生成.o文件

GCC 命令参数
https://www.runoob.com/w3cnote/gcc-parameter-detail.html

-E 预处理
-S //预处理 编译
-c 仅生成.o文件//预处理 编译 汇编
-o 生成可执行文件// 预处理 编译 汇编 链接

在这里插入图片描述

4 链接 linking

https://zhuanlan.zhihu.com/p/83716863

4.1 静态链接

直接把.o文件组合起来,方便,易于调试,但是占用空间比较大。

4.2 动态链接

动态链接的本质是把链接的过程推迟到运行时再进行。