这只是一个makefile的一部分。我不太明白发生了什么。
OBJS = $(SRCS:$(SRC)/%.cpp=$(OBJ)/%.o)
$(OBJS):$(OBJ)/%.o: $(SRC)/%.cpp | print-opts
$(cc-command)
我理解的是这些行将.cpp文件编译成.o,在'print-opts'之后用'cc-command'编译。但我不懂语义。
如果我展开'OBJS'的宏,这一行应该是:
$(SRCS:$(SRC)/%.cpp=$(OBJ)/%.o) : $(OBJ)/%.o: $(SRC)/%.cpp | print-opts
$(cc-command)
对我来说,它看起来像'$(SRCS:$(SRC)/%。cpp = $(OBJ)/%。o)',它声称$(SRC)中的所有.cpp都会来.o在$(OBJ)中,但这取决于$(OBJ)/%。o,这取决于$(SRC)/%。cpp。这没有意义......
我不明白这里等号的含义是什么,以及多个冒号的意思。
答案 0 :(得分:16)
假设您已经定义了这三个变量(如果没有,那么规则将无法正常工作):
SRC = source_dir
OBJ = object_dir
SRCS = source_dir/foo.cpp source_dir/bar.cpp
现在考虑作业
OBJS = $(SRCS:$(SRC)/%.cpp=$(OBJ)/%.o)
这是substitution reference;它表示“对于$(SRCS)
中具有$(SRC)/%.cpp
形式的任何内容,请将其更改为$(OBJ)/%.o
”。因此OBJS
将评估为object_dir/foo.o object_dir/bar.o
。
现在规则:
$(OBJS):$(OBJ)/%.o: $(SRC)/%.cpp | print-opts
$(cc-command)
Thuis是static pattern rule。它指定目标列表($(OBJS)
),目标模式($(OBJ)/%.o
)和先决条件模式($(SRC)/%.cpp
)。使匹配成为目标模式的目标,并使用它来构造先决条件名称。因此,如果Make使用此规则来构建object_dir/foo.o
,则词干将为foo
,先决条件为source_dir/foo.cpp
。
(你没有询问| print-opts
,所以我认为它已经很清楚了。)