文件命名:
makefile 或者 Makefile
Makefile规则
一个Makefile文件中可以有一个或者多个规则
目标...:依赖...
命令(Shell命令)
...
- 目标:最重要生成的文件(伪目标除外)
- 依赖:生成目标所需要的文件或是目标
- 命令:通过执行命令对依赖操作生成目标(命令前必须Tab缩进)
Makefile中的其它规则一般都是为第一条规则服务的
如果第一条规则所依赖的文件没有找到,则继续向下执行下面的规则,否则相应的规则不会执行
在执行规则中的命令时,会比较目标和依赖文件的时间
如果依赖的时间比目标的时间晚,需要重新生成目标
如果依赖的时间比目标的时间早,目标不需要更新,对应规则中的命令不需要被执行
变量
自定义变量
变量名=变量值 var=hello
预定义变量
AR:归档维护程序的名称,默认值为ar
CC:C编译器的名称,默认值为CC
CXX:C++编译器的名称,默认值为g++
$@:目标的完整名称
$<:第一个依赖文件的名称
$^:所有的依赖文件
获取变量的值
$(变量名)
应用
app:main.c a.c b.c
gcc main.c a.c. b.c -o app
等价于
//自动变量只能在规则的命令中使用
$(CC) $^ -o $@
写很多.o: .c很费劲,使用模式匹配%
%.o: %.c // %:通配符,匹配一个字符串 // 这两个%匹配的是同一个字符串 //因此上述中很多行的.o: .c可以写成一行 %.o: %.c gcc -c $^ -o $@
# 通过wildcard函数获取当前目录下所有的.c文件 # 可以写多个目录,用空格隔开 src = $(wildcard ./*.c) # 通过patsubst函数将src字符串中的%.c替换成%.o obj = $(patsubst %.c, %.o, $(src)) target = main $(target): $(obj) gcc $^ -o $@ %.o: %.c gcc -c $^ -o $@ # 用phony定义伪目标,不会与clean文件冲突 # 因为clean没有依赖文件所以只有使用make clean时才会执行 .PHONY:clean clean: rm $(obj) -f