我在这个site上找到了这个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 $@
答案 0 :(得分:29)
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中的第一个实际规则,这告诉要构建all
它必须首先构建$(SOURCES)
和$(EXECUTABLE)
中的所有内容,然后不执行任何操作。由于这是第一个,因此它成为默认目标,因此运行make
相当于make all
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
另一条规则:要创建$(EXECUTABLE)
(扩展为hello
),必须先在$(OBJECTS)
(相当于main.o hello.o factorial.o
)中构建所有内容,然后运行命令{{ 1}}
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
模式规则:为了构建以.cpp.o:
$(CC) $(CFLAGS) -o $@ $<
结尾的文件,首先重建/创建/查找以.cpp结尾的相应文件,然后运行命令.o
。
最后两个规则包含特殊变量$(CC) $(CFLAGS) -o $@ $<
和$@
,它们仅在规则操作中有效并分别扩展到目标和第一个依赖关系
因此,当您运行$<
时,它会读取所有这些,然后尝试构建默认目标(全部)。
由于它不存在,它尝试构建文件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更新,它将运行命令make
。 hello.o和factorial.o也是如此。
完成这些操作后,如果g++ -c -Wall -o main.o main.cpp
不存在或者比那些.o文件中的任何一个(可能刚刚更改过,那么可能很新),它将运行该命令重新链接它。最后,它将运行空命令(什么都不做)来'重建'所有。