我们确实需要Makefile中的“all”目标吗?

时间:2014-03-06 15:16:26

标签: makefile

我从http://mrbook.org/tutorials/make/找到了以下代码:

CC=g++
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.cpp hello.cpp factorial.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=hello

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@

.cpp.o:
    $(CC) $(CFLAGS) $< -o $@

我的问题是:我们真的需要这条线

all: $(SOURCES) $(EXECUTABLE)

如果我不保留该线路或者是否有其他用途,会出现什么问题?

3 个答案:

答案 0 :(得分:0)

如果在未指定目标的情况下运行make,它将运行文件中的第一个目标。此目标负责创建可在您的平台上安装的可部署文件(包或可执行文件),这是一种惯例。名称all只是convention(至少在GNU项目中),可以是您喜欢的任何名称(例如$(name)compiledeployable )。

答案 1 :(得分:0)

我不知道为什么$(SOURCES)变量显示为all目标的先决条件。那是没用的。

在您的情况下,由于您只有一个可执行文件,因此没有必要all。但是许多makefile构建了多个“最终目标”,这些目标并不相互依赖。在这种情况下,传统的all目标依赖于它们,所以你可以用一个命令构建它们。

由于它是传统的,为了保持一致性,人们只将其放入只有一个目标的makefile中。

答案 2 :(得分:0)

从make

的行为角度出发

该行:

all: $(SOURCES) $(EXECUTABLE)

在这种情况下很特殊,因为它是Makefile中定义的第一个目标。由于没有定义.DEFAULT_GOAL使其成为默认目标,因此如果在命令行中未指定目标,那么make的目标是构建。

在这种特殊情况下,它的所有存在都是为了让你使用命令make all

如果存在一个名为 all 的文件,它还确保make allmake不会按预期工作,因为make会在评估规则时考虑这一点。 通常的做法是将这些目标定义为phony,这样它们就不会受到存在名称的文件的影响。

例如:.PHONY : all

此示例中没有任何其他用途的原因是:

  • $(SOURCES)是一个冗余依赖项,因为$(EXECUTABLE)已经通过$(OBJECTS)取决于它,$(SOURCES)通过suffix rule .cpp.o:
  • 另一个依赖$(EXECUTABLE)是下一个定义的目标,因此删除所有目标会使$(EXECUTABLE)成为默认目标。

从惯例的角度来看

all目标是Standard Target,“应该是默认目标”。

某些用户和工具可能会认为所有目标都存在。 例如,IDE eclipse默认情况下要求Makefile具有目标all,它将用于增量构建。没有所有目标,eclipse就需要额外的配置才能构建项目。