Makefile 隐式内置规则和头文件

Makefile 隐式内置规则和头文件,makefile,dependencies,Makefile,Dependencies,我把这个makefile放在一个目录中,目录中有一组.cpp,每个都代表一个程序,并且只依赖于一些头文件。所有文件都在同一目录中 例如,要编译程序a,我需要生成a。make的隐式规则将从a.cpp成功编译a,但是make在其仅标头的依赖项更改时也必须重新生成目标 但是,一旦程序编译,如果我执行以下操作(例如,touch utils.hpp然后重试编译),则以下生成文件不会重建任何内容。发生什么事了 src := $(shell find . -maxdepth 1 -name "*.cpp")

我把这个
makefile
放在一个目录中,目录中有一组
.cpp
,每个都代表一个程序,并且只依赖于一些头文件。所有文件都在同一目录中

例如,要编译程序
a
,我需要
生成a
。make的隐式规则将从
a.cpp
成功编译
a
,但是
make
在其仅标头的依赖项更改时也必须重新生成目标

但是,一旦程序编译,如果我执行以下操作(例如,
touch utils.hpp
然后重试编译),则以下生成文件不会重建任何内容。发生什么事了

src := $(shell find . -maxdepth 1 -name "*.cpp")
exe := $(src:.cpp=)

# In case I want to build every program, w/o a cmd-line target.
all: $(exe)

%: utils.hpp test.hpp

我的make版本是
gnumake4.1

您最后的规则不能用来表示您想要的依赖类型。只有当make需要构建一些东西并且不知道其他规则来实现它时,才会考虑它。相反,您应该在可执行文件列表中表示此依赖项:

$(exe): utils.hpp test.hpp

关于“不知道其他规则来做这件事”,为什么
$(exe):…
会改变这一点?毕竟,
%
包括
$(exe)
和任何其他目标,因为
%
是一种包罗万象的模式。为什么对待
%
的方式不同?GNU Make手册中对此有任何声明吗?@Peregring lk:模式规则是以一种特殊的方式处理的。如果您仔细阅读本手册第一节的第一段,您将理解为什么您的最后手段规则根本不被考虑。这很好:如果模式规则按照您的预期工作,make还将尝试重建您的C源文件。。。