Table of Contents
#custom-toc-container
编译链接
# 编译链接四步骤 编译和链接是程序开发中的两个重要步骤,具体分为四个阶段:预处理(预编译)、编译、汇编和链接。 ## 1. 预处理 预处理(又称预编译),主要处理以**#**开头的**预编译指令**,比如#include、#define等,把源文件变成`中间文件`(.i文件, Intermediate file 或称 临时文件)。 预处理阶段的操作(**主要处理规则**): 1. 将所有的#define删除,并且展开所有的宏定义。 2. 处理所有条件预编译指令,如#if、#ifdef、#elif、#else、#endif。 3. 处理#include预编译指令,将被包含的文件插入(复制粘贴、拷贝)到该预编译指令的位置。此过程是递归进行的,因为被包含的文件可能还包含其他文件。 4. 删除所有的注释。 5. 添加行号和文件名标识,以便编译时编译器产生调试用的行号信息,编译过程中出现编译错误或警告时能够显示行号。 6. 保留所有的#pragma编译器指令,因为编译器要使用它们。 >预编译生成的.i文件不包含任何宏定义,因为所有宏定义都已经展开,并且包含的文件也已经插入到了.i文件中。
所以当无法判断 宏定义是否正确 或 头文件包含是否正确 时,可以查看预编译生成的.i文件来确定问题。 ## 2. 编译 编译(Compile, Compiling) 把预处理生成的文件进行一系列**词法分析、语法分析、语义分析、优化**后,生成相应的`汇编代码文件`(.s文件, Assembly file)。 ## 3. 汇编 汇编器将汇编代码变成机器指令(将汇编文件变成**二进制**目标文件)。 这一阶段没有复杂语法,也没有语义,也不需要优化,只需要一一对应的翻译即可,最后生成`目标文件`(Object file),`Windows中的.obj`,`Linux中的.o`。 ## 4. 链接 链接(Link, Linking) 过程把.o文件和.a库文件链接到一起,生成`可执行文件`。