在 C 中运行 make 文件时的最新消息
Posted
技术标签:
【中文标题】在 C 中运行 make 文件时的最新消息【英文标题】:Up to date message when running a make file in C 【发布时间】:2020-02-06 15:51:39 【问题描述】:我有一个名为 hello 的 make 文件。
hello:
cl hello.c
是它的内容。我没有准备好现有的 .exe,当我输入 nmake hello 时, 我收到一条消息说“你好”是最新的。
预期输出:
我没有得到预期输出的原因是什么? 以及如何让它发挥作用?
非常感谢。
【问题讨论】:
你能在hello
上方添加.PHONY: hello
。这应该使hello
规则一直运行;可能不是你想要的。
天哪,MS 构建工具在使用时产生的混乱数量......
@MarcoBonelli /nologo
开关从cl
和link
(可能还有其他人)中删除商标信息
【参考方案1】:
我没有现有的
.exe
准备好
没关系,但你的目标不是hello.exe
,而是hello
。
最有可能发生的是nmake
告诉您hello
已经是最新的,因为您的文件夹中有一个现有的hello
文件。将规则重命名为hello.exe
:
hello.exe:
cl hello.c
或者保持原样并删除hello
文件。
【讨论】:
【参考方案2】:在您的 MAKEFILE 中:
hello:
cl hello.c
构建hello
目标的规则没有明确的依赖关系,也不匹配任何推理规则(见下文)。 NMAKE 会将其视为伪目标。因为它既是一个伪目标又没有依赖项,所以它总是被认为是最新的,所以不会运行命令块cl hello.c
。
在这种情况下,对于从单个 .c 文件构建 .exe 文件,您不需要显式规则,您可以使用 NMAKE 的内置 .c.exe
inference 规则(推理rule 是 .from.to 形式的特殊规则,其中 from 和 to 是文件扩展名):
# (You do not need to add this to your MAKEFILE. It is a built-in rule of NMAKE.)
.c.exe:
$(CC) $(CFLAGS) $<
CC
宏预定义为 cl
,而 CFLAGS
宏未预定义,因此为空。 $<
是一个特殊的文件名宏,它扩展为一个时间戳比目标晚的依赖文件。 ($<
仅在用于推理规则时有效。)
试试下面的 MAKEFILE:
hello.exe:
这里,hello.exe
是 MAKEFILE 中的第一个目标,default 将被构建的目标也是如此。
目标hello.exe
的MAKEFILE 规则不包含命令块,但由于hello.c
文件存在,它匹配NMAKE 的内置.c.exe
推理规则(如上所述)。当应用于目标hello.exe
时,此推理规则使hello.c
成为目标的隐式依赖,特殊宏$<
将扩展为此隐式依赖,即$<
将扩展为hello.c
。由于$(CFLAGS)
为空,当依赖hello.c
比目标hello.exe
更新时,推理规则将导致运行以下命令:
cl hello.c
【讨论】:
“构建 hello 目标的规则没有依赖关系。NMAKE 不会构建任何东西” - 这根本不是真的,它只是一个无依赖关系的目标,也称为伪目标.这是完全有效的。 @MarcoBonelli 谢谢。我希望对第一段有所改进,以解释为什么在这种情况下没有构建任何内容。以上是关于在 C 中运行 make 文件时的最新消息的主要内容,如果未能解决你的问题,请参考以下文章
使用最新的yum在CentOS6.5上安装nginx时的目录问题