注意:文档中的Makefile尽量不要复制 容易出问题
特殊变量
$@:当前目标
$^:当前规则中的所有依赖
$<:依赖中的第一个
$$:当前执行的进程编号
$*:模式规则中所有%匹配的部分
$?:模式规则中所有比目标更新的文件列表
test: A B C
@echo
'$$@ = ' $@
@echo
'$$^ = ' $^
@echo
'$$< = ' $
<
@echo
'$$$$ = ' $$$$
@echo
'$$* = ' $*
@echo
'$$? = ' $?
A:
touch A
B:
touch B
C:
touch C
输出结果: $@ = test $^ = A B C $< = A $$ = 17678 $* = $? = A B C
利用特殊变量 优化Makefile
TGT
= a.out
SRCS
= main.c test.c
$(TGT): $(SRCS)
gcc $^ -o
$@
clean:
rm -f
$(TGT)
升级写法
TGT
= a.out
SRCS
= main.c test.c
OBJ
= main.o test.o
CC
= gcc
$(TGT): $(OBJ)
$(CC) $^ -o TGT
main.o: main.c
$(CC) -c $^ -o
$@
test.o: test.c
$(CC) -c $^ -o
$@
clean:
rm -f
$(TGT) $(OBJ)
再升级 (模式规则 %.o %.c…)
模式规则中记得要用$<(依赖中的第一个)
TGT
= a.out
SRCS
= main.c test.c
OBJ
= main.o test.o
CC
= gcc
$(TGT): $(OBJ)
$(CC) $^ -o
$@
%.o: %.c
$(CC) -c $
< -o
$@
clean:
rm -f
$(TGT) $(OBJ)
优化
TGT
= a.out
SRCS
= main.c test.c
CC
= gcc
$(TGT): $(SRCS:.c=.o)
$(CC) $^ -o
%.o: %.c
$(CC) -c $
<
clean:
rm -f
$(TGT) $(SRCS:.c=.o)
隐含规则:可以通过命令make -p打印出所有的隐含规则
在模式规则中,必须用$
< ?
经过测试 使用$^和$
<都是一样的 下面的命令打印出来的结果是一样的
8 %.o: %.c
9
$(CC) -c $
< -o
$@
10 @echo
'$@'
11 @echo
'$^'
12 @echo
'$<'
输出结果: zys@ubuntu:~/linux/application/makefile/p4$ make gcc -c main.c -o main.o main.o main.c main.c gcc -c test.c -o test.o test.o test.c test.c gcc main.o test.o -o a.out