Makefile (四)

                      Makefile变量

Makefile 变量分为:用户自定义变量、预定义变量、自动变量、环境变量。

在上一篇博客中Makefile中的内容如下:

OBJ =world

OBJS = world.o robot.o human.o animal.o

CC = gcc

CFLAGS = -c -o

$(OBJ): $(OBJS)

       $(CC)$(OBJS) -o $(OBJ)

animal.o: animal.c

       $(CC)animal.c $(CFLAGS) animal.o

human.o: human.c

       $(CC)human.c $(CFLAGS) human.o

robot.o: robot.c

       $(CC)robot.c $(CFLAGS) robot.o

world.o: world.c

       $(CC)world.c $(CFLAGS) world.o

clean:

       rm$(OBJ) $(OBJS)

我们观察Makefile中的内容,发现目标文件与依赖文件总是重复出现,比如:

animal.o: animal.c

       $(CC)animal.c $(CFLAGS) animal.o

animal.c 与animal.o

human.o: human.c

       $(CC)human.c $(CFLAGS) human.o

human.o与 human.c

……

这时Makefile中的变量又引入了自动变量规则。

自动变量通常可以替代Makefile中重复出现的目标文件与依赖文件。

Makefile中自动变量有:

       $*:不包含扩展名的目标文件名称

       $+: 所有的依赖文件,以空格分开,并以出现的先后次序

       $?: 所有时间戳比目标文件晚的依赖文件,并以空格分开

       $@:表示一个规则中的目标

       $^:表示规则的所有依赖的文件名。注意一般情况下$^只会在makefile内出现一次

       $<:表示规则的第一个依赖的文件名。若为自动推导,则为该规则添加第一个依赖文件名

通过自动变量,上面的Makefile可以继续简化为:

OBJ =world

OBJS = world.o robot.o human.o animal.o

CC = gcc

CFLAGS = -c -o

$(OBJ): $(OBJS)

       $(CC)$(OBJS) -o $(OBJ)

animal.o: animal.c

       $(CC)$^ $(CFLAGS) $@

human.o: human.c

       $(CC)$^ $(CFLAGS) $@

robot.o: robot.c

       $(CC)$^ $(CFLAGS) $@

world.o: world.c

       $(CC)$^ $(CFLAGS) $@

clean:

       rm$(OBJ) $(OBJS)

我们观察Makefile中的内容,发现以下几个编译命令都非常形似:

animal.o: animal.c

       $(CC)$^ $(CFLAGS) $@

human.o: human.c

       $(CC)$^ $(CFLAGS) $@

robot.o: robot.c

       $(CC)$^ $(CFLAGS) $@

world.o: world.c

       $(CC)$^ $(CFLAGS) $@

是否可以将这几个编译命令写成一个编译命令?这就需要用到Makefile中的通配符:%

利用 % ,Makefilei可以简化如下:

OBJ =world

OBJS = world.o robot.o human.o animal.o

CC = gcc

CFLAGS = -c -o

$(OBJ): $(OBJS)

       $(CC)$(OBJS) -o $(OBJ)

%.o: %.c

       $(CC)$^ $(CFLAGS) $@

clean:

       rm$(OBJ) $(OBJS)


猜你喜欢

转载自blog.csdn.net/weixin_42048417/article/details/80214256