CC=g++
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.cpp hello.cpp factorial.cpp
将四个变量设置为常量字符串。对于 makefile 的其余部分,无论出现在哪里(例如)$(CC),它将被 g++ 替换
OBJECTS=$(SOURCES:.cpp=.o)
将变量 OBJECTS 设置为与 SOURCES 相同,除非模式 .cpp 出现在 SOURCES 的单词中,它被 .o 替换
EXECUTABLE=hello
设置另一个常量字符串 var
all: $(SOURCES) $(EXECUTABLE)
makefile 中的第一条实际规则,它告诉 make 要构建 all,它必须首先构建 $(SOURCES) 和 $(EXECUTABLE) 中的所有内容,然后什么都不做。既然是第一个,就成为默认目标,所以运行make就相当于make all
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
另一个规则:要创建$(EXECUTABLE)(扩展为hello),它必须首先在$(OBJECTS)(相当于main.o hello.o factorial.o)中构建所有内容,然后运行命令$(CC) $(LDFLAGS) $(OBJECTS) -o $@
.cpp.o:
$(CC) $(CFLAGS) -o $@ $<
模式规则:为了构建以.o结尾的文件,首先重建/创建/找到对应的以.cpp结尾的文件,然后运行命令$(CC) $(CFLAGS) -o $@ $<。
最后两个规则包含特殊变量$@ 和$<,它们仅在规则操作中有效,并分别扩展到目标和第一个依赖项
因此,当您运行make 时,它会读取所有这些内容,然后尝试构建默认目标(全部)。
由于它不存在,它会尝试构建文件 main.cpp、hello.cpp、factorial.cpp 和 hello。由于前 3 个(大概)存在,它会为它们寻找规则/依赖关系,但没有找到,因此决定对它们无事可做。如果它们不存在,make 会给出错误提示“no rule to make target 'main.cpp'”
在“hello”的情况下,它依赖于 main.o、hello.o 和 factorial.o,所以它会查看它们。对于 main.o,模式规则说它依赖于 main.cpp,所以如果 main.o 不存在或者如果 main.cpp 更新,它将运行命令g++ -c -Wall -o main.o main.cpp。 hello.o 和 factorial.o 也是如此。
一旦完成,如果hello 不存在或比任何这些 .o 文件都旧(可能刚刚更改,因此可能很新),它将运行该命令以重新链接它。最后,它将运行空命令(什么都不做)来“重建”所有。