9

这只是生成文件的一部分。我不太明白发生了什么。

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 都会在 $( OBJ),但这将取决于 $(OBJ)/%.o,它取决于 $(SRC)/%.cpp。这没有意义...

我不明白这里的等号是什么意思,多个冒号是什么意思。

4

1 回答 1

18

假设你已经定义了这三个变量(如果你没有,规则就不会很好地工作):

SRC = source_dir
OBJ = object_dir
SRCS = source_dir/foo.cpp source_dir/bar.cpp

现在考虑分配

OBJS = $(SRCS:$(SRC)/%.cpp=$(OBJ)/%.o)

这是一个替代参考;它说“对于任何$(SRCS)具有形式的东西$(SRC)/%.cpp,将其更改为$(OBJ)/%.o”。所以OBJS将评估为object_dir/foo.o object_dir/bar.o

现在规则:

$(OBJS):$(OBJ)/%.o: $(SRC)/%.cpp | print-opts
    $(cc-command)

Thuis 是一个静态模式规则。它指定了一个目标列表 ( $(OBJS))、一个目标模式 ( $(OBJ)/%.o) 和一个先决条件模式 ( $(SRC)/%.cpp)。Make 将目标与目标模式匹配,并使用它来构造先决条件名称。因此,如果 Make 使用此规则构建object_dir/foo.o,则词干为foo,前提条件为source_dir/foo.cpp

(你没有问关于| print-opts,所以我认为它已经很清楚了。)

于 2012-07-11T14:14:32.603 回答