【问题标题】:Implicit built-in rules and header files隐式内置规则和头文件
【发布时间】:2018-06-24 01:43:12
【问题描述】:

我将这个makefile 放在一个包含一组.cpp 的目录中,每个都代表一个具有一些仅标题依赖关系的单个程序。所有文件都在同一个目录中。

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

但是,一旦程序编译,如果我这样做,以下 makefile 不会重建任何内容,例如,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版本是GNU Make 4.1

【问题讨论】:

    标签: makefile dependencies


    【解决方案1】:

    你的最后手段规则不能用来表达你想要的依赖类型。仅当 make 需要构建某些东西并且不知道其他规则来执行它时才考虑它。相反,您应该在可执行列表中表达这种依赖关系:

    $(exe): utils.hpp test.hpp
    

    【讨论】:

    • 关于“不知道其他规则可以做到”,为什么$(exe): ... 会改变这个?毕竟,% 包括$(exe) 和任何其他目标,因为% 是一个包罗万象的模式。为什么不同地对待%? GNU Make 手册中是否对此有任何声明?
    • @Peregring-lk:模式规则以特殊方式处理。如果您仔细阅读手册Implicit Rule Search Algorithm 部分的第一段,您就会明白为什么根本不考虑您的最后手段规则。这很好:如果模式规则按您的预期工作,make 也会尝试重建您的 C 源文件...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 2011-11-30
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    相关资源
    最近更新 更多