Makefile:头文件变更如何触发目标执行?
问题:修改头文件为何触发Makefile中Block 1的执行?
我编写了如下Makefile:
# # General Makefile # BUILD := build CXXFLAG := -std=c++20 CXX := g++ SRC := 16.15.cc OBJ := $(SRC:%.cc=$(BUILD)/%.o) DEP := $(OBJ:.o=.d) MKDIR_P := mkdir -p all: directories $(OBJ) directories: $(MKDIR_P) $(BUILD) $(BUILD)/%.o: %.cc # --> block 1 echo 1 -$(CXX) -c $(CXXFLAG) $< -o $@ $(BUILD)/16.15.o: 16.15.cc include/16.15.h # --> block 2 .PHONY: directories all
观察现象:当修改并保存include/16.15.h后,Block 1被执行,执行日志如下:
$ make mkdir -p build echo 1 1 g++ -c -std=c++20 16.15.cc -o build/16.15.o
请问:头文件的修改为何会触发Block 1的执行?
回答
这是因为你定义的Block 2是一个只有依赖、没有命令的显式规则,而Block 1是能匹配该目标的模式规则,具体逻辑如下:
- 当修改
include/16.15.h后,Make会检查目标build/16.15.o的依赖链:发现头文件的修改时间晚于目标文件build/16.15.o,判定该目标需要重新构建。 - 虽然Block 2为
build/16.15.o补充了额外依赖,但没有编写任何构建命令。此时Make会自动寻找可匹配该目标的模式规则(也就是Block 1),复用其中的命令完成构建操作。 - 所以最终执行的是Block 1里的
echo 1和编译命令,也就出现了你看到的执行日志。
如果想为该目标指定专属构建命令,只需在Block 2下方添加对应的命令行即可;如果只是想补充依赖而不改变构建逻辑,当前的写法是完全合理的,Make会自动复用模式规则的命令。
内容的提问来源于stack exchange,提问作者yapkm01
相关产品推荐
相关产品推荐

