MAKEFILE 学习笔记 —— 简介
一. 编译与链接
把源文件编译成中间代码文件,在 Windows 下也就是 .obj 文件,Linux 下是 .o 文件,即 Object File,这个动作叫做编译(compile)。编译时,编译器检查语法的正确性,函数与变量的声明的正确性。只有所有的语法正确,编译器就可以编译出中间目标文件,每个源文件对应一个目标文件。
把大量的 Object File 合成可执行文件,这个动作叫作链接(link)。链接时,主要链接全局变量与函数。
二. 编译规则
- 如果工程没有被编译过,则将所有的源文件进行编译并链接为目标程序。
- 如果该工程,有几个 c 文件被改变了,只重新编译这几个 c 文件 。
- 如果是头文件被改变了,则只重新编译引用这几个头文件的 c 程序。
三. MAKEFILE 格式
makefile 是通过文件之间相互依赖进行编译并链接的,即目标文件是由哪些文件生成的。格式如下:
target: files
command
- target : 生成的目标文件
- files : 要生成 target 所需要的文件或是目标
- command:编译或链接命令
注:
command 命令一定以 TAB 键开始,并且前面不能有空格,若使用 vim在 /etc/vim/vimrc 文件中将 set expandtab 删除,它将导致格式错误。
代码例子:
aaa: main.o func.o
gcc -o aaa main.o func.o
main.o: main.c ex2.h
gcc -std=c99 -c main.c
func.o: func.c ex2.h
gcc -std=c99 -c func.c
clean:
rm -fr *.o aaa
四. MAKE 的工作过程
- 找到当前目录下名为“makefile”或“MAKEFILE”文件
- 再“makefile”中找到第一个 target,在上面的代码中为 aaa,并把这个文件作为最终的文件
- 如果 aaa 不存在或者 aaa 所依赖的文件比如 main.o 比较新,那么会重新运行 gcc -o aaa main.o func.o 来生成 aaa
- 如果 aaa 所依赖的.o文件不存在,比如 main.o 不存在,则运行 gcc -std=c99 -c main.c 来生成 main.o,在运行 2 来生成 aaa
- 依次类推直到生成 aaa。
参考文献
[1] 陈浩 《跟我一起写Makefile》