一、通配符

*

  1. *
  2. 例子一:会扩展到所有 .o 结尾的文件
  3. clean:
  4. rm -rf *.o
  5. 例子二:下面表达式不会扩展
  6. Object = *.o
  7. 使用 object := $(wildcard *.o) 会进行扩展

%

  1. 自动构造规则。
  2. %.o : %.c
  3. gcc -o $@ $<
  4. 等效于如下:(但是 生产的文件必须被其他target使用)
  5. test1.o : test1.c
  6. gcc -o test1.o test1.c
  7. test2.o : test2.c
  8. gcc -o test2.o test2.c

参考:https://www.cnblogs.com/warren-wong/p/3979270.html

二、变量

$@:目标的名字
$^:构造所需文件列表所有所有文件的名字
$<:构造所需文件列表的第一个文件的名字

  1. test1.o : test1.c other.h
  2. gcc -o $@ $<
  3. 此时:$< 表示 test1.c
  4. $^ 表示 test1.c other.h

$?:构造所需文件列表中更新过的文件

三、几个函数

  1. wildcard 扩展通配符
  2. notdir:去除路径
  3. $(SOURCES:.c=.o):表示变量SOURCES中.c 结尾的替换成.o结尾。
  4. addprefix: 增加前缀

一个例子:
image.png

  1. make all:
  2. 达到 OBJECTS SOURCE的返回值
  3. echo ./build//chunk.o ./build//common.o ./build//debug.o ./build//main.o ./build//memory.o
  4. ./build//chunk.o ./build//common.o ./build//debug.o ./build//main.o ./build//memory.o
  5. echo .//chunk.c .//common.c .//debug.c .//main.c .//memory.c
  6. .//chunk.c .//common.c .//debug.c .//main.c .//memory.c

参考:https://blog.csdn.net/liangkaiming/article/details/6267357