在 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 开关从cllink(可能还有其他人)中删除商标信息 【参考方案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 形式的特殊规则,其中 fromto 是文件扩展名):

# (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 宏未预定义,因此为空。 $&lt; 是一个特殊的文件名宏,它扩展为一个时间戳比目标晚的依赖文件。 ($&lt; 仅在用于推理规则时有效。)

试试下面的 MAKEFILE:

hello.exe:

这里,hello.exe 是 MAKEFILE 中的第一个目标,default 将被构建的目标也是如此。

目标hello.exe 的MAKEFILE 规则不包含命令块,但由于hello.c 文件存在,它匹配NMAKE 的内置.c.exe 推理规则(如上所述)。当应用于目标hello.exe 时,此推理规则使hello.c 成为目标的隐式依赖,特殊宏$&lt; 将扩展为此隐式依赖,即$&lt; 将扩展为hello.c。由于$(CFLAGS) 为空,当依赖hello.c 比目标hello.exe 更新时,推理规则将导致运行以下命令:

cl hello.c

【讨论】:

“构建 hello 目标的规则没有依赖关系。NMAKE 不会构建任何东西” - 这根本不是真的,它只是一个无依赖关系的目标,也称为伪目标.这是完全有效的。 @MarcoBonelli 谢谢。我希望对第一段有所改进,以解释为什么在这种情况下没有构建任何内容。

以上是关于在 C 中运行 make 文件时的最新消息的主要内容,如果未能解决你的问题,请参考以下文章

Makefile - 用于C程序的Unix

包含 iostream 时的 VS Code 错误消息

使用最新的yum在CentOS6.5上安装nginx时的目录问题

脚手架身份时的VS错误消息

汇编器消息:没有这样的指令:编译 C - GCC 9.3.0、Ubuntu 20.04 时的“endbr64”

杂记编译内核时的一些记录