一、编译和链接的作用
在使用C语言编译器的时候,当我们写完一个.c文件并选择编译运行它的时候,文件经过了编译(生成.obj),链接(生成.exe,就是可执行文件)的过程,然后在一定的运行环境下运行得出结果。
二、编译的三步:预处理、编译、汇编
(假设写了一个名为test.c的文件)
2.1预处理
2.1.1预处理生成的文件
预处理后生成的文件名为test.i,文件中包括了许多前驱代码,在最后的代码中,我们可以看到经过处理后的文本文件代码。
2.1.2预处理所做的工作
①展开所用#include预处理指令
②删去所有#define,将内容替换到代码中
③保留#pragram的编译器指令,处理其他所有的条件编译指令,如#if,#endif,#ifdef,#elif,#else,#ifndef等等。
④删去所有注释
2.2编译
2.2.1编译后生成的文件
编译后生成的文件名为test.s,这是一个汇编文件,其中不再有我们所熟悉的代码,取而代之的是汇编指令
2.2.2编译过程所分三步
①词法分析:通过扫描器实现,把代码中的字符分割成一系列记号
②语法分析:通过语法分析器实现,分析以表达式为节点的语法树
③语义分析:通过语义分析器,进行对表达式语义层面的静态分析,包括声明,类型的匹配与转换等等;此外,该阶段也会报出错误的语法分析
2.3汇编
2.3.1汇编后生成的文件
汇编后生成的文件名为test.obj(Windows下,而在Linux操作系统下会生成test.o,两者都是目标文件)
2.3.2汇编过程所做的工作
使用汇编器,将汇编代码转换为机器可识别的二进制指令,但过程本身只是进行了一次对照编译,不做指令的优化
三、链接
3.1链接所解决的问题
链接是为了解决一个项目中多文件,多模块的相互调用问题
3.2链接过程所涉及到的文件与库
①当项目中有多个.c文件的时候,每个.c文件都单独经过编译器生成.obj目标文件,链接过程包括了全部的目标文件
②连接过程还有链接库的参与,该库包括了初始引用的各个库函数
四、运行环境的三个步骤
4.1程序必须载入内存中
①有操作系统交给操作系统来完成
②在一个独立环境中,程序的载入需要手动安排(比如单片机)
4.2开始执行程序
调用main函数,此时程序默认开始使用一个运行时的堆栈,,一个静态内存
4.3程序终止
①正常main函数的结束
②意外导致的程序终止