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

时间:2011-02-23 23:48:34

标签: makefile

我在这个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 $@

1 个答案:

答案 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文件中的任何一个(可能刚刚更改过,那么可能很新),它将运行该命令重新链接它。最后,它将运行空命令(什么都不做)来'重建'所有。