使用 Make 出现“无目标”错误

ahm*_*med 14 make

我正在学习如何使用make和生成文件,所以我写了这个小文件:

%.markdown: %.html
    pandoc -o $< $@
Run Code Online (Sandbox Code Playgroud)

但是当我运行时make,我得到的只是make: *** No targets. Stop.发生了什么?

pol*_*lym 19

问题:

你的问题是make不知道你的目标。

make stackoverflow.markdown例如,您可以使用上面的 Makefile 运行它,它会起作用。

make 但是, only 会失败,因为您只指定了如何创建目标,而不是指定哪个。

正如leiaz 指出的那样,上述模式规则称为隐式规则

生成文件:

SRC = $(wildcard *.html)
TAR = $(SRC:.html=.markdown)

.PHONY: all clean

all: $(TAR)

%.markdown: %.html
    pandoc -o $< $@

clean:
    rm -f $(TAR)
Run Code Online (Sandbox Code Playgroud)

解释:

SRC.html通过 Makefile 的 .get获取所有源文件(以 结尾的文件)wildcard

TAR将 中列出的每个源文件替换为SRC.markdown而不是结尾的目标.html

.PHONY列出了总是过时并因此总是被执行的非物理目标 - 这些通常是allclean

目标all具有作为依赖(文件上的右侧列出:全部)*.markdown的文件。这意味着所有这些目标都被执行。

%.markdown: %.html
    pandoc -o $< $@
Run Code Online (Sandbox Code Playgroud)

这段代码说:每个以 结尾的目标.markdown都依赖于一个同名的文件,除了依赖以.html. 的通配符%被看作是一个*在壳等。在%右侧,然而,相比于比赛左侧。来源

请注意,前面的空格序列pandoc是 a TAB,因为make将其定义为标准。

最后,虚假clean目标描述了如何从您使用此 Makefile 创建的文件中清除您的系统。在这种情况下,它会删除所有目标(那些名为*.markdown.

  • 很好的答案,这些是我在尝试进一步理解它时发现的其他链接:[通配符函数](https://www.gnu.org/software/make/manual/html_node/Wildcard-Function.html),[替换参考] (https://www.gnu.org/software/make/manual/html_node/Substitution-Refs.html#Substitution-Refs) 和 [虚假目标](https://www.gnu.org/software/make/手册/html_node/Phony-Targets.html)。 (2认同)

Lei*_*iaz 5

模式规则是隐式规则。

您的 Makefile 中没有定义目标。您可以在命令行上指定目标:make something.markdown将使用配方创建something.markdownsomething.html

或者您可以将指定默认目标的规则添加到您的 Makefile。

all: file1.markdown file2.markdown
Run Code Online (Sandbox Code Playgroud)

或者使用通配符:

all: *.markdown
Run Code Online (Sandbox Code Playgroud)

当您运行 just 时make第一条规则的第一个目标是默认目标。它不需要被调用all

所以上面,目标all有你想制作的所有文件作为先决条件,所以当你make all,它会制作所有列出的文件。