第一步,预定义变量的声明
CC:=gcc
RM:=rm -f
第二步,定义目标和需要的依赖文件
此处可以利用函数来检索当前目录下,所以符合模式规则的文件
src := $( wildcard *.c)
//文件名的检索替换有三种方式,
//1,利用已有变量,通过模式串直接替换
obj:= $(src:%.c=%.o)
//2.通过字符串模式替换函数进行替换
out:=$(patstrst %.c,%.out,$(src))
第三步,设定目标及其依赖,以及目标实现的规则
//多个目标生成一个可执行文件的做法
//生成目标文件
$(out):$(obj)
$(CC) -o $@ $^
//生成obj文件
$(obj):$(src)
$(CC) -c $^ -o $@
//根据源文件生成多个可执行文件的做法
//定义一个统一的目标
makefile仅仅生成一个起始定义的目标,因此,如果需要生成多个可执行文件时,需要加一个伪目标,让输出的文件成为二级依赖
all:$(out)
//此处$< 自动变量比较关键,其意义是将依赖文件拆开一个一个进行匹配
//如果使用了$^的话,是使用全部的依赖文件进行匹配。效果是生成一个可执行文件,从而出现main函数重复定义的问题
此处必须使用%来进行目标文件和依赖文件的声明、定义。因为%有递归匹配的含义。如果使用普通变量的话,$@会匹配所有目标文件, 但$<只会匹配依赖文件中的第一个。关键问题是目标文件和依赖文件的处理。
%.out:%.o
$(CC) -o $@ $<
%.o:%.c
$(CC) -c $^ $@
//使用$(out) 匹配字符串,按所有字符串在一起进行处理。使用%.out 将字符串,按模式递归匹配处理
//第四步,根据需要设定重建以及清理文件
.PHONY:rebuild clean
rebuild:$(out) clean
clean:
$(RM) $(out) $(obj)