在上一篇文件中,Makefile,存在目标名和先决条件名在规则中的命令中重复出现。如果目标名或先决条件改名发生改变时,就得在相应的命令中跟着改,
如果数量多的话,会很麻烦。
但是我们可以 借助一些自动变量。
$@ :用于表示一个规则中的目标。当一个规则中有多个目标是,$@所指的是其中任何造成规则命令被执行的目标。
$^ :表示规则中的所有先决条件(或者依赖条件)。
$< :表嫂规则中的第一个先决条件。
.PHONY:clean
CC = gcc
RM = rm
EXE = all
OBJS = main.o foo.o
$(EXE): $(OBJS)
$(CC) -o $(EXE) $(OBJS)
main.o: main.c
$(CC) -o main.o -c main.c
foo.o: foo.c foo.h
$(CC) -o foo.o -c foo.c
clean:
$(RM) -rf $(EXE) $(OBJS)
可以将上述文件使用自动变量后,修改如下:
.PHONY:clean
CC = gcc
RM = rm
EXE = all
OBJS = main.o foo.o
$(EXE): $(OBJS)
$(CC) -o $@ $^
main.o: main.c
$(CC) -o $@ -c $^
foo.o: foo.c foo.h
$(CC) -o foo.o -c foo.c
clean:
$(RM) -rf $(EXE) $(OBJS)
此时需要主要的是但依赖文件有多个的时候不能是用 $^ ,否则会出现以下错误
gcc -o main.o -c main.c
gcc -o foo.o -c foo.c foo.h
gcc: 致命错误: 当有多个文件时不能在已指定 -c 或 -S 的情况下指定 -o
编译中断。
make: *** [foo.o] 错误 4