本文共 1689 字,大约阅读时间需要 5 分钟。
应用场景:头文件更新了 如何让源文件也自动更新
gcc *.c -I./head
TGT = a.outSRCS = main.c test.c foo.c#CROSS_COMPILE = arm-linux-genuabihf-CC = $(CROSS_COMPILE)gccCFLAGS = -I$(HEAD_PATH)CUR_PATH = $(shell pwd)HEAD_PATH = $(CUR_PATH)/head$(TGT): $(SRCS:.c=.o) $(CC) $^ $(CFLAGS) -o $@%.o: %.c $(CC) -c $<%.d: %.c $(CC) -MM $< > $@sinclude $(SRCS:.c=.d)clean: rm -vf $(TGT) $(SRCS:.c=.o) $(SRCS:.c=.d)
分析:
把文件所需的依赖,全部写在Makefile中,如果某个依赖更新了,那么对应的目标肯定也会更新。 命令 $(CC) -MM $< > $@ 会将当前路径下的所有.c的依赖输出到文件%.d中去,然后sinclude把所有的.d文件的内容加载进来,%.d: %.c $(CC) -MM $< > $@main.o: main.c head/head.htest.o: test.cfoo.o: foo.c
所以,当依赖比目标更新的时候,自然就引发目标的重新编译了
输出结果:
zys@ubuntu:~/linux/application/makefile/p5$ make gcc -MM foo.c > foo.d gcc -MM test.c > test.d gcc -MM main.c > main.d gcc -c main.c gcc -c test.c gcc -c foo.c gcc main.o test.o foo.o -I/home/zys/linux/application/makefile/p5/head -o a.out可以看到输出结果是先输出.d 再输出.o。
如果把$(CC) -c $< 和 $(CC) -MM $< > $@交换下位置 会不会先输出.o呢TGT = a.outSRCS = main.c test.c foo.c#CROSS_COMPILE = arm-linux-genuabihf-CC = $(CROSS_COMPILE)gccCFLAGS = -I$(HEAD_PATH)CUR_PATH = $(shell pwd)HEAD_PATH = $(CUR_PATH)/head$(TGT): $(SRCS:.c=.o) $(CC) $^ $(CFLAGS) -o $@ %.d: %.c $(CC) -MM $< > $@sinclude $(SRCS:.c=.d)%.o: %.c $(CC) -c $< clean: rm -vf $(TGT) $(SRCS:.c=.o) $(SRCS:.c=.d) .PHONY: clean
输出结果:
gcc -MM foo.c > foo.d gcc -MM test.c > test.d gcc -MM main.c > main.d gcc -c main.c gcc -c test.c gcc -c foo.c gcc main.o test.o foo.o -I/home/zys/linux/application/makefile/p5/head -o a.out 输出结果仍然是.d再前 由此看来,输出结果跟命令的先后顺序无关疑问:
不是一个真正的目标,仅仅是为了执行其所在的规则下面的命令,不应该让make来判断它是否存在,或者是否应该被生成。.PHONY clean
转载地址:http://yxqqj.baihongyu.com/