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

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

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

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

但当我跑步时make,我得到的只是“make: *** No targets. Stop.发生了什么事?”

答案1

问题:

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

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

make但是,only 会失败,因为您只指定了如何创建目标,但没有指定创建目标。

作为莱亚兹点出局了上述模式规则称为隐性规则

生成文件:

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

.PHONY: all clean

all: $(TAR)

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

clean:
    rm -f $(TAR)

解释:

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

柏油替代品列出的每个源文件的SRC目标都以..markdown而不是. 结尾。.html

。假列出总是过时的非物理目标,因此总是被执行 - 这些通常是allclean

目标all具有依赖项(在右侧列出的文件:)所有*.markdown文件。这意味着所有这些目标都已执行。

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

此代码片段表示:每个以 结尾的目标.markdown都依赖于具有相同名称的文件,但依赖关系以.html.这通配符%被视为类似于*shell。然而,右侧的比赛%与左侧的比赛进行了比较。来源

笔记前面的空白序列pandoc是 a TAB,因为make将其定义为标准。

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

答案2

模式规则是隐含的规则。

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

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

all: file1.markdown file2.markdown

或者使用通配符:

all: *.markdown

当你刚刚跑步时make第一条规则的第一个目标是默认目标。它不需要被调用all

因此,上面,目标all具有您想要制作的所有文件作为先决条件,因此当您 时make all,它将制作所有列出的文件。

相关内容