对于C这种编译性语言,我们平时编译时,不管是通过IDE图形界面,还是通过命令行,总感觉编译一下就完成了,然后就得到了针对某OS和某CPU的二进制可执行文件(机器指令的文件)。但是实际上在源码到可执行文件中间隐藏了四个过程,这四个过程被OS默默的处理了。
编译四个过程:预处理、编译、汇编、链接
1.预编译
如果编译过程是一次性完成的话,.i文件只是一个过渡性文件,.i被称为扩展后的c源码文件。
image
预处理做了哪些工作?
①宏替换:将宏替换为真实的宏体,比如 程序性中有使用NUM这个宏,这个宏的定义为#define NUM 100,程序中所有的NUM都会被替换为100。
②包含头文件 将include包含的.h头文件内容,全部复制到.c文件中,因为头文件中定义了类型、宏、函数声明等等,这些都是函数调用会用到的,你调用某个函数时,就必须包含这个函数要的头文件。
疑问:头文件那么多内容,都包含进去的话,不会太多了吗?
编译时,编译器只使用要用的东西,用完后包含的内容都会被丢弃,实际上并不占空间。
③条件编译 处理#if #endif 这类的东西
④处理一些特殊的预处理关键字
2.编译
预编译.l文件到.s 汇编文件
image
编译做了什么
将c语法的c源码,翻译为汇编语法的汇编源码。
3.汇编
汇编文件到二进制文件
image
4.链接
image链接(连接)做了什么
①将众多的.o合成一个完整的可执行文件。 .o实现相互依赖的,比如a.o中调用的函数,被定义在了b.o中,如果不链接在一起的话,是无法工作的。
②链接时,需要加入额外的启动代码。这个启动代码并不是我们自己写的,main函数是由启动代码调用的,我们的程序是从启动代码开始运行的。
③链接为一个可执行文件时,需要进行符号解析和地址重定位
网友评论