Makefile教程(三)

it2026-04-07  2

自动生成依赖性

应用场景:头文件更新了 如何让源文件也自动更新

目录结构

直接编译的话 会报错 找不到头文件 所以这里通过 -I指定头文件路径 或者 在#include “head/head.h”

gcc *.c -I./head TGT = a.out SRCS = main.c test.c foo.c #CROSS_COMPILE = arm-linux-genuabihf- CC = $(CROSS_COMPILE)gcc CFLAGS = -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.h test.o: test.c foo.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.out SRCS = main.c test.c foo.c #CROSS_COMPILE = arm-linux-genuabihf- CC = $(CROSS_COMPILE)gcc CFLAGS = -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再前 由此看来,输出结果跟命令的先后顺序无关

疑问: 执行过程:1-2-3 .d为啥为生成呢 什么时候生成

伪目标

不是一个真正的目标,仅仅是为了执行其所在的规则下面的命令,不应该让make来判断它是否存在,或者是否应该被生成。 .PHONY clean
最新回复(0)