Makefile 有人能解释一下这个文件吗?

Makefile 有人能解释一下这个文件吗?,makefile,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) $(OBJE

我在上面找到了这个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 $@
CC=g++
CFLAGS=-c-墙
LDFLAGS=
SOURCES=main.cpp hello.cpp factorial.cpp
对象=$(源:.cpp=.o)
可执行文件=你好
全部:$(源)$(可执行)
$(可执行文件):$(对象)
$(CC)$(LDFLAGS)$(对象)-o$@
.cpp.o:
$(CC)$(CFLAGS)$<-o$@
将四个变量设置为常量字符串。对于makefile的其余部分,只要出现
$(CC)
(例如),它就会被
g++

OBJECTS=$(SOURCES:.cpp=.o)
将变量对象设置为与源相同,除非模式
.cpp
出现在源字中,其替换为
.o

EXECUTABLE=hello
设置另一个常量字符串变量

all: $(SOURCES) $(EXECUTABLE)
makefile中的第一条实际规则告诉make,要构建
all
,它必须首先在
$(源代码)
$(可执行文件)
中构建所有内容,然后什么也不做。因为这是第一个,所以它成为默认目标,所以运行
make
相当于
makeall

$(EXECUTABLE): $(OBJECTS) 
        $(CC) $(LDFLAGS) $(OBJECTS) -o $@
另一条规则:要创建
$(可执行文件)
(扩展为
hello
),必须首先在
$(对象)
(相当于
main.o hello.o factorial.o
)中构建所有内容,然后运行命令
$(CC)$(LDFLAGS)$(对象)-o$

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

模式规则:为了构建一个以
.o
结尾的文件,首先重建/创建/查找以.cpp结尾的相应文件,然后运行命令
$(CC)$(CFLAGS)-o$@$。Chris指出的第一行是定义速记的,其余是“依赖关系图”。当您更改源文件时,
make
系统将开始自下而上执行规则以获得最终结果,最终创建一个最新的可执行文件
hello
已编译。我唯一不明白的是,为什么在模式规则中需要再次调用
-o$@
。你能给我解释一下吗?Thanks@Kyrol:
-o
指定要写入的文件的名称。在某些编译器上,默认输出文件可能已经与目标文件相同,但重新指定不会有任何影响。
.cpp.o:
不是后缀规则而不是模式规则吗?@jdnight:技术上是,但是后缀规则和模式规则实际上只是同一事物的两个稍有不同的语法——一个基于文件名模式匹配目标的规则,并根据它计算出依赖关系。@MarcusJ:您可以使用类似于
$(OBJDIR)/%的规则。o:%.c$(CC)$(CFLAGS)-c-o$@$
.cpp.o:
        $(CC) $(CFLAGS) -o $@ $<