Makefile 没有命令的规则,例如;a、 h:b.h";,在生成文件中生效

Makefile 没有命令的规则,例如;a、 h:b.h";,在生成文件中生效,makefile,Makefile,例如: # I understand this rule, # which will compile a.c if b.h has been updated due to some implicit rules and dependency. a.o: b.h # But I don't understand the rule below. # In reality, if c.h is modified, then when you run "make a.o", you will re-g

例如:

# I understand this rule,
# which will compile a.c if b.h has been updated due to some implicit rules and dependency.
a.o: b.h

# But I don't understand the rule below.
# In reality, if c.h is modified, then when you run "make a.o", you will re-generate a.o.
# What I don't get is that, in theory, since the rule does not update b.h
# and a.o relies on b.h only according to the rule above 
# (I know a.o relies on c.h, indirectly),
# a.o should not be re-generated, right?
b.h: c.h
我查阅了gnu make手册,但没有找到解释上述行为的语法

有人能指出吗

编辑:当我读到一些关于如何编写描述头文件依赖关系的规则的文章时,我有一个问题。我猜想一旦c.h被修改(基于我对那篇文章的理解)被证明是错误的,a.o就会重新生成。我刚试过。a、 o在这种情况下不会再生,这也符合我的想法。我会重读那篇文章,看看为什么我对这篇文章有这样的误解。无论如何,我道歉。这是一个错误的问题


Edit2:我终于找到了导致我错误理解的原因。如果您搜索“Vector.h:Foo.h”,您会发现作者在该部分提供了错误的知识。小心!再次抱歉,在这里提问之前,我没有尝试就认为它是真的。

请参阅POSIX make规范中的以下文本:

如果没有为目标列出命令,则应将目标视为最新的

我真的不明白你对发生了什么的评论。如果所有三个文件
a.o
b.h
c.h
都存在,并且
a.o
b.h
新(因此不需要基于第一个目标重建),但比
c.h
旧(因此理论上需要基于第二个目标重建),事实上,运行make时,
a.o
将不会更新

这是因为上面的规则,因为没有构建
b.h
的规则,它被认为是最新的,因此没有被修改,因此它的(早于
a.o
)时间戳被比较,而
a.o
不需要更新


如果这不是您的意思,请通过提供准确的观察结果(可能显示一些示例输出)来澄清您的问题。

观察如果您更改
c.h
,运行
make
,然后再次运行
make
(这次不做任何更改),会发生什么情况。这能让你知道这里发生了什么吗?谢谢Zack。对于那些读了这篇文章并感到困惑的人来说,这只是一个澄清。“b.h:c.h”实际上没有效果。也就是说,在修改c.h并运行make之后,修改不会使a.o重新生成。