示例

当一个目标需要执行多个命令时,可以在 Makefile 中为该目标提供多行命令。每一行命令都必须以制表符开始。以下是一个简单的示例:

all: clean build run

clean:
    rm -f my_program

build:
    gcc -Wall -o my_program main.c util.c

run:
    ./my_program

在这个示例中:

  • all 是默认目标,它依赖于 cleanbuildrun
  • clean 目标删除 my_program 可执行文件。
  • build 目标编译源文件生成可执行文件。
  • run 目标运行可执行文件。

你可以使用以下命令来执行默认目标 all

make

或者直接指定目标:

make build

当你运行 make 命令时,它将按照依赖关系执行目标,确保每个目标都是最新的。在上面的示例中,all 依赖于 cleanbuildrun,因此这些目标将按照指定的顺序执行。

注意:在 Makefile 中,确保使用制表符而不是空格,因为 Make 工具对此有特殊的要求。

添加多个命令

如果你想在 clean 目标中添加多个 Shell 命令,可以将它们放在同一行,并使用分号 ; 将它们分隔。下面是一个示例:

clean:
    rm -f my_program; \
    rm -f *.o; \
    echo "Cleanup complete"

在这个例子中,clean 目标包含三个 Shell 命令。每个命令都以分号 ; 结尾,表示命令的结束。使用 \ 来表示命令在多行上续行。

如果你希望多个命令按照顺序执行,但是希望其中一个失败时不会中断整个 Makefile 的执行,可以使用 ; 将它们分隔开。如果你希望后续命令只在前面的命令成功时执行,可以使用 && 连接命令,例如:

clean:
    rm -f my_program && \
    rm -f *.o && \
    echo "Cleanup complete"

这样,如果其中一个 rm 命令失败,后续的命令将不会执行。

常见错误

makefile:8: *** missing separator. Stop.

这个错误通常表示在 Makefile 中使用了不正确的缩进。在 Makefile 中,必须使用 Tab(制表符)来缩进命令,而不是空格。

作者简介

Chun-Hui Gao is a Research Associate at Huazhong Agricultural University.

重复使用

Text and figures are licensed under Creative Commons Attribution CC BY 4.0. The source code is licensed under MIT. The full source is available at https://github.com/yihui/hugo-prose.

欢迎修订

如果您发现本文里含有任何错误(包括错别字和标点符号),欢迎在本站的 GitHub 项目里提交修订意见。

引用本文

如果您使用了本文的内容,请按照以下方式引用:

gaoch (2023). Makefile 怎么写. BIO-SPRING. /post/2023/12/24/makefile-howto/

BibTeX citation

@misc{
  title = "Makefile 怎么写",
  author = "gaoch",
  year = "2023",
  journal = "BIO-SPRING",
  note = "/post/2023/12/24/makefile-howto/"
}