四、Makefile自动化变量、通配符

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)
  1. *.c中的 * 这是shell下的命令,而 %.c%是 Makefile中的命令。进而可以解释为什么 %.c或%.o用在Makefile规则条件中,命令中使用的是*.c
  2. 变量赋值的时候,使用shell命令的格式 $(shell command)
  3. 命令前加@表示make时不输出make信息。

参考

参考1:Makefile自动化变量

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值