什么是Makefile脚本:
Makefile脚本集合了程序的编译指令的文件,make是一个命令工具,当执行make命令时,它会自动读取Makefile中的编译指令并执行,会自动完成整个项目的自动化编译工作。
为什么需要Makefile脚本:
项目中如何有很多.c文件,它们的编译指令会有很多,需要的编译时间比较长,依赖关系非常复杂。
当项目中的.h文件被修改时、.c文件,我们无法人为的分辨出哪些文件需要重新编译,只能全部重新编译一下,但这项操作非常耗时。
所以使用Makefile脚本编译项目:
1、节约时间
2、记录文件之间依赖关系
3、自动化执行编译过程
Makefile脚本的原理:
Makefile脚本的原理就是基于文件最后修改时间,被依赖文件的最后修改时间晚于目标文件,该文件就需要重新编译。
hello.c > hello.o
gcc -c hello.c
hello.h > hello.o
gcc -c hello.c
Makefile脚本的格式:
由若干个编译目标组成,它类似C语言中的函数,就是若干个编译指令组成的编译模块,默认只执行排在第一个的编译目标,也叫入口目标。
target ... : prerequisites ...
command
...
...
target:编译目标,它如果不存在,或者早于它依赖的文件,那么就执行该下面的编译指令。
prerequisites:被依赖的编译目标、文件,相当于C语言虽的函数调用。
command:编译指令
在Makefile脚本中可以使用变量:
变量名=value 定义变量并给变量赋值初值
$(变量名) 使用变量名,获取出变量的值。
常用的变量名:
CC=编译器
STD=语法标准
FLAG=检查标准,-Wall,-Werror
TARGE=最终可执行文件的名字
OBJECT=所有的目标文件名
负责清理的编译目标:
该编译目标一般负责删除目标文件、头文件的编译结果、可执行文件。
一般它不会被依赖,也就是不会执行,而是当需要时,在命令行通过make 目标名,手动执行。
什么时候需要它执行:
1、刚修改的内容,并没有发生变化,有可能是依赖有问题,代码并没有重新编译,执行它就可以删除所有目标文件、可执行文件,重新编译。
2、更换了执行平台后,那么之前编译出的目标文件就全部不能再继续使用。
3、项目最终上线时,会把所有的编译结果删除,重新编译。
clean:
rm -rf $(OBJECT) $(TARGE)
rm -rf .h.gch
通用的Makefile文件模板:
CC=gcc
STD=-std=gnu99
FLAG=-Wall -Werror
TARGE=manager
OBJECT=main.o tools.o manager_user.o
$(TARGE):$(OBJECT)
$(CC) $(OBJECT) -o $(TARGE)
%.o:%.c
$(CC) $(STD) $(FLAG) -c $<
clean:
rm -rf $(OBJECT) $(TARGE)
rm -rf .h.gch