隐式规则与显式规则

时间:2018-02-21 17:43:51

标签: makefile

我不明白为什么make和为什么make会重制文件。

隐含规则:

foo : foo.o bar.o
    cc -o foo foo.o bar.o $(CFLAGS) $(LDFLAGS)

明确规则:

foo.o: foo.p

以上显式规则会重新制作foo.o吗? 为什么不呢?

1 个答案:

答案 0 :(得分:0)

与@ user657267一样,我不完全清楚问题是什么,但让我试着引导你完成它。

我假设您要么键入make foo,要么键入makefoo:是默认目标(最接近makefile顶部的目标) )。

foo取决于foo.obar.o,所以在它可以制作foo之前,必须首先检查这些内容。 Make将首先检查foo.o。根据您的Makefile,这取决于foo.p

但是,因为您没有在foo.o: foo.p行中指定配方,所以您只是生成了依赖项而不是规则,因此它将继续查找其他依赖项/规则。由于未指定显式规则来构建foo.o,因此make将搜索匹配的隐式规则。

假设它找到隐式规则%.o: %.c(在make中默认启用)。如果有foo.c,则会尝试使用此规则。由于此规则也依赖%.c,因此foo.c也被视为依赖项。

foo.o现在依赖于foo.cfoo.p。如果其中任何一个比foo.o更新,或者如果foo.o不存在,那么它将被视为过时,make将在隐式规则中运行配方。否则,它会认为foo.o是最新的而不是重建它。

如果make重建foo.o,那么它会认为foo已过期,并且它也会重建foo

有一些我没有提及的特殊情况,例如make如何决定适用哪种模式规则等,但是jist就在那里。您应该阅读makefile文档(https://www.gnu.org/software/make/manual/make.html)以获取有关make如何工作的更多信息。