1 自动变量
自动变量 | 含义 |
---|---|
$< | 第一个依赖文件 |
$@ | 目标文件的完整名称 |
$^ | 所有不重复的依赖文件,以空格分开 |
$* | 不包含扩展名的目标文件名称 |
$+ | 所有的依赖文件,以空格分开,并以出现的先后顺序,可能包含重复的依赖文件 |
$? | 所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚 |
$% | 当目标文件是一个静态库文件时,代表静态库的一个成员名。 |
eg.
INC:= -I/home/Lieryang/
%.o:%.c %.h
$(CC) -c $< -o $@ $(INC)
Q:为什么使用 $<
而不使用 $@
A:$< 表示的是第一个依赖文件,如果编译 maic.h main.c的时候,依赖文件是两个,gcc多个文件同时编译的时候, 不能同时使用 -c -o选项。然而头文件可以在指定目录中搜索。
2 通配符
通配符 | 含义 |
---|---|
* | 匹配0个或者任意个字符 |
? | 匹配一个字符 |
% | 把我们所有需要的文件组合成一个列表,从列表中挨个取出每一个文件 |
依赖规则中不能使用通配符。通配符要想赋值给变量,就需要使用下面第一个函数。
- wildcard 扩展通配符,搜索指定文件。在此我们使用 SRCS := $(wildcard *.c),代表在当前目录下搜索所有的.c文件,并赋值给src。函数执行结束后,SRCS的值为 main.c add.c minus.c。
- patsubst 替换通配符,按指定规则做替换。例子如下:
# 代表将SRCS里的每个文件都由.c替换成.o
OBJS:= $(patsubst %.c, %.o, $(SRCS))
除了使用patsubst函数外,我们也可以使用模式规则达到同样的效果,比如:
OBJS:=$(SRCS:%.c=%.o)
3 目标文件搜索
3.1 VPATH的使用
把src的值赋值给变量VPATH,所以执行make的时候会从src目录下找我们需要的文件。
VPATH:=src
当存在多个路径的时候要使用空格或者冒号隔开,表示在多个路径下搜索文件。 我们可以这样写
VPATH:=src car
或者是
VPATH:=src:car
3.3 vpath
vpath 条件 路径
vpath %.c source
vpath %.h include
4 示例
# 文件结构
|_____Lieryang
|______main.c
|______Makefile
|______include
|_____main.h
|______source
|_____test1.c
|_____test2.c
SRC:= $(wildcard *.c)
SRC+= $(wildcard source/*.c)
# SRC += $(shell ls source/*.c)
OBJ:= $(SRC:.c=.o)
INC:= -I./include
test:$(OBJ)
$(CC) $^ -o $@
%.o:%.c
@$(CC) -c $< -o $@ $(INC)
clean:
rm -rf $(OBJ)
*.c
中的*
这是shell下的命令,而%.c
中%
是 Makefile中的命令。进而可以解释为什么 %.c或%.o用在Makefile规则条件中,命令中使用的是*.c
。- 变量赋值的时候,使用shell命令的格式
$(shell command)
。 - 命令前加@表示make时不输出make信息。