把一系列命令批量放在文件中,统一执行。管理项目代码编译,节省编译时间。
一、一个规则
目标:依赖
(tab)命令
基本原则:
1、若生成目标,检查规则中的依赖条件是否存在,如果不存在,则寻找有否有规则用来生成该依赖文件。
2、检查规则中的目标是否需要更新,必须先检查它的所有依赖,依赖中有任意一个被更新,则目标必须更新。
ALL :指定目标。
二、两个函数
src = $(wildcard ./*.c)
找到当前目标下所有后缀为.c的文件,赋值给src
obj = $(patsubst %.c,%.o,$(src))
把src变量里所有后缀为.c的文件替换成.o
clean:
-rm -rf $(obj) a.out "-"删除不存在的文件,不报错
三、三个自动变量
$@ :在规则的命令中,表示规则中的目标。
$^:在规则的命令中,表示规则中所有依赖条件。
$< :在规则的命令中,表示规则中第一个依赖条件。如果将该变量应用在模式规则中,它可以将依赖条件中依赖依次取出,套用模式规则。
四、模式规则
%.o:%.c
gcc -c $< -o $@
静态模式规则
$(obj):%.o:%c
gcc -c $< -o $@
伪目标
.PHONY :clean ALL
1 src = $(wildcard ./*.c) 2 target = $(patsubst %.c,% ,$(src)) 3 4 ALL :$(target) 5 6 %:%.c 7 gcc $< -o $@ 8 9 clean: 10 -rm -rf $(target) 11 .PHONY 12 ALL clean
1 #当前目录下src文件夹下的所有.c文件 2 src = $(wildcard ./src/*.c) 3 #把参数三中含有参数一的生成.o文件,并把.o文件放在当前目录下obj文件夹#下 4 obj = $(patsubst ./src/%.c ,./obj/%.o, $(src)) 5 6 myArg = -Wall -g 7 8 inc_Path = ./inc 9 10 ALL:a.out 11 12 a.out:$(obj) 13 gcc $^ -o $@ $(myArg) 14 ./obj/%.o:./src/%.c 15 gcc -c $< -o $@ $(myArg) -I $(inc_Path) 16 17 clean : 18 -rm -rf $(obj) a.out 19 20 .PHONY: clean ALL