我不明白为什么make和为什么make会重制文件。
隐含规则:
foo : foo.o bar.o
cc -o foo foo.o bar.o $(CFLAGS) $(LDFLAGS)
明确规则:
foo.o: foo.p
以上显式规则会重新制作foo.o吗? 为什么不呢?
答案 0 :(得分:0)
与@ user657267一样,我不完全清楚问题是什么,但让我试着引导你完成它。
我假设您要么键入make foo
,要么键入make
,foo:
是默认目标(最接近makefile顶部的目标) )。
foo
取决于foo.o
和bar.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.c
和foo.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如何工作的更多信息。