Makefile 中的“ all”代表什么?

我阅读了一些关于 Makefile 的教程,但是对我来说,目标“ all”代表什么以及它做什么还不清楚。

有什么想法吗?

151337 次浏览

不知道它代表什么特别的东西。它只是一个约定,即提供一个“ all”规则,通常用于列出构建整个项目所需的所有子目标,因此命名为“ all”。它唯一的特别之处在于,人们经常把它作为 makefile 中的第一个目标,这意味着只需键入“ make”就可以完成与“ make all”相同的任务。

目标“ all”是一个虚拟目标的例子——磁盘上没有名为“ all”的东西。这意味着当您执行“ make all”时,make 总是认为需要构建它,因此执行该目标的所有命令。这些命令通常是构建 makefile 所知道的所有最终产品的命令,但它可以执行任何操作。

其他虚拟目标的例子有“ clean”和“ install”,它们的工作方式是相同的。

如果你还没有阅读它,你应该阅读 GNU 制作手册,这也是一个很好的教程。

Makefile 所理解的构建包含许多目标。例如,要构建一个项目,您可能需要

  1. 用 file1.c 构建 file1.o
  2. 用 file2.c 构建 file2.o
  3. 用 file3.c 构建 file3.o
  4. 从 file1.o 和 file3.o 构建可执行文件1
  5. 从 file2.o 构建可执行文件2

如果您使用 makefile 实现了这个工作流,那么您可以分别创建每个目标。例如,如果你写

make file1.o

它只会在必要的时候建立那个文件。

all的名称不固定。它只是一个常规名称; all目标表示 如果调用它,make will build < strong > all 完成一个完整的 build 所需的内容。这通常是一个虚拟目标,它不创建任何文件,只是依赖于其他文件。对于上面的例子,构建必要的 所有是构建可执行文件,其他文件作为依赖项被拉入。在 makefile 中是这样的:

all: executable1 executable2

all目标通常是 makefile 中的第一个目标,因为如果只是在命令行中编写 make,而没有指定目标,那么它将构建第一个目标。你希望它是 all

all通常也是 .PHONY的目标。

GNUMake 的手册在其 list of standard targets中给出了 all的明确定义。

如果 Makefile 的作者遵循这一公约,那么目标 all应该:

  1. 编译整个程序,但不编译构建文档。
  2. 作为默认目标。就像在运行 make时应该做的和 make all一样。

要实现1个 all,通常定义为一个取决于构成整个程序的可执行文件的 .PHONY目标:

.PHONY : all
all : executable

要实现2个 all,应该是 make 文件中定义的第一个目标,或者被指定为默认目标:

.DEFAULT_GOAL := all