You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 01:36:06