我好困惑 所以说我有以下内容
all: one one: two two: three three: echo Hello
然后 创建文件“all”比文件“one”更晚,或者创建文件“三”比文件“one”更晚更改输出hello??
最佳答案
all
, one
, two
和three
不是文件。他们是目标。
您的规则都不会创建与这些目标对应的任何文件。 Make 会将目标视为文件,因为它们没有被声明为虚假。
文件中的第一个目标是 all
,所以它是默认的。因为它不是.PHONY
目标,Make将访问文件系统以查看是否存在名为all
的文件。对应目标。它会注意到all
不存在。因此all
的正文必须执行规则(“配方”)才能创建 all
。但是,这不能立即完成。
all
的空食谱无法立即执行,因为all
有一个名为 one
的先决条件 。 Make 将访问文件系统以查看是否 one
存在,并发现它不存在。在这种情况下,Make 会搜索其余规则以查看是否 one
似乎是一个目标,而且确实如此。然后它处理 one : two
尝试更新 one
规则目标。
以这种方式,它会遍历所有依赖规则,直到 three:
规则已达到。这没有任何先决条件,并且有一个名为 three
的文件不存在,因此执行配方。 echo
命令已运行。
在echo
之后命令运行后,配方将以成功状态终止。此时,Make 假定目标 three
已更新,忽略文件仍然不存在的情况。请记住,目标与文件不同;目标与文件不同。它是Make中的一个概念,也是Make内存中的一个对象。 “目标已更新”状态仅意味着 Make 在内部将其内存中目标对象标记为已更新,因为配方已成功执行。
自 three
目标被视为已更新,并且它是 two
的唯一先决条件,two
现在可以激活规则。它的空主体被执行并成功,因此 two
被视为已更新。
同样,one :
的空体然后执行规则,最后执行 all
的规则规则。
什么是虚假目标?我们这样声明它们:
.PHONY: all one two three
这告诉 Make 所有这些目标都不对应于文件。虚假目标始终被视为对应文件丢失的目标,因此始终需要更新。 Make 不会检查虚假目标的文件是否存在。
声明虚假目标非常重要。例如,考虑以下规则:
clean:
rm -f $(OBJS)
如果clean
未声明.PHONY:
,那么如果您不小心创建了一个名为 clean
的文件, make clean
不会做任何事情!相反,您会看到类似 "make: 'clean' is up to date."
的消息。 .
关于c - 首先为 makefile 创建哪个文件有关系吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53216164/