我在这个网站上找到了这个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文件(可能刚刚更改,因此可能是新的)更旧,它将运行该命令以重新链接它.最后,它将运行空命令(什么都不做)来'重建'所有.