把一系列命令批量放在文件中,统一执行。管理项目代码编译,节省编译时间。

一、一个规则

  目标:依赖

  (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