写在最前面:所有的博文都是为了若干年月以后当我再次翻看可以快速回想起之前的零星知识。学海无涯,在看这篇文章的未来的你,加油吧!
目录
一、Makefile简介
Makefile是一种用于编译的脚本语言,它可以很便捷地管理项目的代码编译。如果项目中某些源文件被修改则只编译这几个被修改的源文件。又或者某个头文件被修改,则重新编译所有包含该头文件的源文件。文件夹内的makefile文件可以写做makefile或者Makefile。
二、Linux环境下的C语言编译过程
为了更好地理解makefile的编译工作流程,首先要搞明白一次完整的c语言的编译过程是什么样子的。gcc是我们常用的编译器,我们以它为例进行说明。
2.1 gcc编译流程
一个c源文件最终只有生成可执行文件才能被机器正确执行。使用gcc编译程序时,该过程分为以下四个阶段:预处理、编译、汇编、链接。假设我们有一个c源文件:啊对对对.c,我们用这个程序的变化过程来详细解释gcc的各编译阶段。(文献[5]中详细地进行了解释,下面为了方便理解,我们将[5]中各概念再次给出)
(1)预处理
该阶段编译器主要做加载头文件、宏替换、条件编译等工作,一般用于处理带"#"的语句,如#define xxx xxx。可以使用gcc -E 选项进行查看。在这一步骤中.c文件被预处理输出为.i文件,即
啊对对对.c --> 啊对对对.i
(2)编译
编译阶段主要做语法检查和词法分析,在确认所有指令都符合语法规则之后,将.i文件翻译成等价的中间代码或汇编代码。可以使用gcc -S 选项进行查看。在这一步骤中.i文件被编译输出为.s文件,即
啊对对对.i --> 啊对对对.s
(3)汇编
汇编阶段将.s文件转成二进制目标代码.o文件(并非最终的可执行文件)。在这一步骤中.s文件被汇编输出为.o文件,即
啊对对对.s --> 啊对对对.o
(4)链接
最终的链接阶段,将目标文件、启动代码、库文件链接成可执行文件。在这一步骤中.o文件被链接成最终的可执行文件,即
啊对对对.o --> 啊对对对 //假设最终的可执行文件的名字叫做:啊对对对(当然也可以不叫这个名字)
综上所述,一个c源文件最终生成可执行文件要经过如下的过程:
gcc阶段 | 文件类型(源文件为.c) |
预处理 | .c → .i |
编译 | .i →.s |
汇编 | .s →.o |
链接 |