有人可以解释这个make文件吗?

jum*_*ett 15 makefile

我在这个网站上找到了这个makefile .他们没有解释这个例子,所以我想知道是否有人新的发生了什么.

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 $@
Run Code Online (Sandbox Code Playgroud)

Chr*_*odd 29

CC=g++
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.cpp hello.cpp factorial.cpp
Run Code Online (Sandbox Code Playgroud)

将四个变量设置为常量字符串.对于makefile的其余部分,无论$(CC)出现在哪里(例如),它都将替换为g++

OBJECTS=$(SOURCES:.cpp=.o)
Run Code Online (Sandbox Code Playgroud)

将变量OBJECTS设置为与SOURCES相同,除非模式.cpp出现在SOURCES的单词中,其替换为.o

EXECUTABLE=hello
Run Code Online (Sandbox Code Playgroud)

设置另一个常量字符串var

all: $(SOURCES) $(EXECUTABLE)
Run Code Online (Sandbox Code Playgroud)

Makefile中的第一个实际的规则,这告诉make建设all首先必须建立在一切$(SOURCES)$(EXECUTABLE),然后什么也不做.由于这是第一个,它成为默认目标,因此运行make相当于make all

$(EXECUTABLE): $(OBJECTS) 
        $(CC) $(LDFLAGS) $(OBJECTS) -o $@
Run Code Online (Sandbox Code Playgroud)

另一个规则:要创建$(EXECUTABLE)(扩展为hello),它必须首先构建所有内容$(OBJECTS)(等效于main.o hello.o factorial.o),然后运行命令$(CC) $(LDFLAGS) $(OBJECTS) -o $@

.cpp.o:
        $(CC) $(CFLAGS) -o $@ $<
Run Code Online (Sandbox Code Playgroud)

模式规则:为了构建以文件结尾的文件.o,首先重建/创建/查找以.cpp结尾的相应文件,然后运行该命令$(CC) $(CFLAGS) -o $@ $<.

最后两个规则包含特殊变量$@,$<这些变量仅在规则操作中有效,并分别扩展到目标和第一个依赖关系

因此,当您运行时make,它会读取所有这些,然后尝试构建默认目标(全部).由于它不存在,它尝试构建文件main.cpp,hello.cpp,factorial.cpp和hello.由于前三个(可能)存在,它为它们寻找规则/依赖,但没有找到,所以决定它们没有任何关系.如果它们不存在,那么make会给出一个错误,说"没有规则来制作目标'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文件(可能刚刚更改,因此可能是新的)更旧,它将运行该命令以重新链接它.最后,它将运行空命令(什么都不做)来'重建'所有.