我从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)
如果我不保留该线路或者是否有其他用途,会出现什么问题?
答案 0 :(得分:0)
如果在未指定目标的情况下运行make
,它将运行文件中的第一个目标。此目标负责创建可在您的平台上安装的可部署文件(包或可执行文件),这是一种惯例。名称all
只是convention(至少在GNU项目中),可以是您喜欢的任何名称(例如$(name)
,compile
或deployable
)。
答案 1 :(得分:0)
我不知道为什么$(SOURCES)
变量显示为all
目标的先决条件。那是没用的。
在您的情况下,由于您只有一个可执行文件,因此没有必要all
。但是许多makefile构建了多个“最终目标”,这些目标并不相互依赖。在这种情况下,传统的all
目标依赖于它们,所以你可以用一个命令构建它们。
由于它是传统的,为了保持一致性,人们只将其放入只有一个目标的makefile中。
答案 2 :(得分:0)
从make
的行为角度出发该行:
all: $(SOURCES) $(EXECUTABLE)
在这种情况下很特殊,因为它是Makefile中定义的第一个目标。由于没有定义.DEFAULT_GOAL
使其成为默认目标,因此如果在命令行中未指定目标,那么make的目标是构建。
在这种特殊情况下,它的所有存在都是为了让你使用命令make all
。
如果存在一个名为 all 的文件,它还确保make all
和make
不会按预期工作,因为make会在评估规则时考虑这一点。
通常的做法是将这些目标定义为phony,这样它们就不会受到存在名称的文件的影响。
例如:.PHONY : all
。
此示例中没有任何其他用途的原因是:
$(SOURCES)
是一个冗余依赖项,因为$(EXECUTABLE)
已经通过$(OBJECTS)
取决于它,$(SOURCES)
通过suffix rule .cpp.o:
$(EXECUTABLE)
是下一个定义的目标,因此删除所有目标会使$(EXECUTABLE)
成为默认目标。从惯例的角度来看
all
目标是Standard Target,“应该是默认目标”。
某些用户和工具可能会认为所有目标都存在。
例如,IDE eclipse默认情况下要求Makefile具有目标all
,它将用于增量构建。没有所有目标,eclipse就需要额外的配置才能构建项目。