Makefile教程(二)

it2025-10-14  1

注意:文档中的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

#a.out: main.c test.c # gcc main.c test.c 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 $@ # 这个%.o应该是对应一个匹配的文件 所以后面加上 -o $@ 也是没问题的 不写也是没问题的(默认就会生成%.o) clean: rm -f $(TGT) $(OBJ)

优化

TGT = a.out SRCS = main.c test.c CC = gcc # 将源文件中的.c生成.o $(TGT): $(SRCS:.c=.o) $(CC) $^ -o #@ # 模式规则是一个循环取出的过程,每次取出一个.c,然后调用命令生成.o,直到将所有的.c取完为止 %.o: %.c $(CC) -c $< clean: rm -f $(TGT) $(SRCS:.c=.o)

隐含规则:可以通过命令make -p打印出所有的隐含规则

#%.o: %.c # $(CC) -c $< # 这条规则可以不写 因为make会自动根据.o查找对应的.c文件编译生成.o 这就是隐含规则 在模式规则中,必须用$< ? 经过测试 使用$^和$<都是一样的 下面的命令打印出来的结果是一样的 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

最新回复(0)