!!!本文内容毕业生面试必问哈。
编译过程
编译包含四个阶段,预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)、链接(Linking)。执行这四个阶段的程序(预处理器、编译器、汇编器、和链接器)构成了编译系统。
预处理将.c文件编程.i文件;
编译将.i文件变成.s文件;
汇编将.s文件编程.o文件;
链接将所有.o文件(目标代码、系统的标准启动代码和库代码)生成可执行文件;
前3个步骤我们都称之为编译,所以,C代码通过编译和链接生成可执行文件。
C 使用这种分而治之的方法方便对程序进行模块化,可以独立编译单独的模块,稍后再用链接器合并已编译的模块。
这里对汇编器生成的文件描述以下,.o文件我们称之为目标文件,此时它还不能使用,为什么呢?
因为它只是编译器翻译出来的源代码,它还缺失了启动代码和库代码,启动代码充当着程序和操作系统之间的接口。库函数如printf,目标代码文件并不包含该函数的代码,它只包含了使用 printf()函数的指令。printf()函数真正的代码储存在另一个被称为库的文件中。库文件中有许多函数的目标代码。
什么叫模块化?
比如说led.c作为1个模块,key.c作为一个模块,他们是单独的独立编译,然后再链接到一个可执行文件。这也是符合软件高内聚、低耦合的思想。