前言
Makefile指定了工程中文件的编译顺序,好处就是自动化编译,make是一个命令工具,用来解释Makefile文件中的指令。
一、Makeflie文件命名规则
文件命名: makefile 或者 Makefile
命名规则:
目标xxx:依赖xxx
命令(shell命令)
...
- 目标:最终要生成的可执行文件
- 依赖:生成目标所需要的文件或目标
- 命令:执行命令对依赖进行操作,进而生成目标(命令前需要加tab的缩进符)
makefile文件中可以一条或多头规则,其他的规则一般都是为第一条规则服务的,如果有个规则和第一条规则无关,是不会执行的。
二、Makeflie的工作原理
- 命令执行前,先检查规则中的依赖是否存在,存在就直接执行,不存在的话就向下检查其他规则,查找是否有其他规则用于生成该依赖,并执行该规则中的命令。
- 检测更新,在执行规则中的命令时,会比较目标和依赖文件的时间,如果依赖文件的时间比目标晚,则需要重新生成目标;如果依赖文件的时间比目标早,目标不需要更新,其规则下的命令也不会执行,但是可以使用
make 目标名
的方式强制执行。
三、Makeflie的变量(在命令中使用)
- 自定义变量
变量名=变量值
- 预定义变量
AR:归档维护程序的名称,默认值为 ar (静态库制作工具)
CC:C 编译器的名称,默认值为 cc
CXX:C++ 编译器的名称,默认为 g++
$@:目标的完整名称
$<:第一个依赖文件的名称
$^: 所有的依赖文件
- 获取变量的值
$(变量名)
通配符
% 匹配一个字符串
,用于目标和依赖(%.o:%.c
四、Makeflie的函数
$(wildcard PATTERN…)
- 功能:获取指定目录下,指定文件列表;
- 参数:PATTERN 一个或者多个目录下的某种类型的文件,如果有多个目录需要用空格隔开
- 返回:得到若干文件列表,文件名用空格隔开
$(wildcard ./*.c ../sub/*.c)
$(patsubst pattern, replacement, text)
- 功能:查找text中的单词是否符合模式pattern,如果匹配就用 replacement 代替
- 参数:pattern 和 replacement 可以包含通配符 %,也可以使用 \ 转义符表示真实的 %
- 返回:替换后的字符串
$(patsubst %.c, %.o, x.c bar.c)
五、伪目标
使用伪目标不会和已存在的文件比较,例如定义目标名 clean,如果目录中也存在clean这个文件,那么使用make clean就不会执行,因为clean没有依赖,clean这个文件永远是最新的。
.PHONY clean
clean:
rm $(objs) -f