Makefile:所有与默认目标

问题描述 投票:0回答:3

谈论 GNU make,PHONY 目标

all:
default:
之间有什么区别。

CC=g++
default: hello

hello: hello.cpp
     $(CC) -o hello hello.cpp

CC=g++
all: hello

hello: hello.cpp
     $(CC) -o hello hello.cpp

他们都做同样的工作。

makefile gnu-make
3个回答
40
投票

如果您愿意,可以称呼他们为

shirley
;您提到的标签都没有任何特殊的语义。如果您未将目标指定为命令行参数,则
make
的默认行为是运行
Makefile
中的第一个目标。如果您想覆盖此行为,可以使用
.DEFAULT_GOAL
特殊变量。

有一个约定,即有一个名为

all
的目标来构建所有内容,但这只是人类约定,就 Make 而言不是特殊情况或要求。

类似地,有一个(弱)约定来调用默认目标

default
,但同样,这只是一个人类标签(并且与
all
约定有些重叠并可能冲突)。

因此以下 Makefile 执行完全相同的操作:

.PHONY: shirley all default
default: hello
all: hello
shirley: hello

hello: hello.cpp
# (Make already knows how to build an executable out of a .cpp file)

您可以省略上面的任何或所有虚假目标,唯一的区别是,当人们(实际上)表示

make shirley
时,他们将无法说
make hello

底线:构建您的 Makefile,以便

make
能够满足合理的最终用户的期望,而无需阅读太多
README
文件或检查
Makefile
。通常这将是
make all
(并且您可能应该有一个具有此名称的目标,只是为了满足人类约定,即使它不是默认值)但这显然取决于您的项目和用户的期望。

别叫我雪莉。


7
投票

唯一的区别是,GNU Make 手册中推荐使用

all
作为第一个(默认)目标,而
default
没有这样的特别推荐。


4
投票

一个拼写为“all”,另一个拼写为“default”。他们之间没有其他区别。也许如果您解释一下您提出问题的原因,我们就能提供更多帮助。

请注意,在上面的示例中,两个目标实际上都不是假的。你必须这样声明它们:

.PHONY: all

等等

© www.soinside.com 2019 - 2024. All rights reserved.