c - 首先为 makefile 创建哪个文件有关系吗?

标签 c gcc makefile

我好困惑 所以说我有以下内容

all: one

one: two

two: three

three: 

   echo Hello

然后 创建文件“all”比文件“one”更晚,或者创建文件“三”比文件“one”更晚更改输出hello??

最佳答案

all , one , twothree不是文件。他们是目标

您的规则都不会创建与这些目标对应的任何文件。 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/

相关文章:

makefile - 如何在 makefile 中写入 'cd' 命令?

c - void* 指向结构?

c - 从标准输入读取整数并存储在二维数组中 (C)

c - Shell命令makefile参数函数

Mac OS 10.6/Snow Leopard 上的 Python 构建问题

gcc - 构建 R 包时如何链接静态库

C++ 包含和 Makefile

c - scanf() 将换行符保留在缓冲区中

在C中将两个数字转换为一个

c - GCC 错误 undefined reference to `sqrt' on changing command option order