这只是makefile的一部分。我不太了解发生了什么。
OBJS = $(SRCS:$(SRC)/%.cpp=$(OBJ)/%.o)
$(OBJS):$(OBJ)/%.o: $(SRC)/%.cpp | print-opts
$(cc-command)
我所知道的是,这些行在'print-opts'之后使用'cc-command'将.cpp文件编译为.o。但是我不理解语义。
如果我扩展“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。这没有道理...
我不明白这里的等号是什么意思,以及多个冒号是什么意思。
最佳答案
假设您已经定义了这三个变量(如果尚未定义,则该规则将无法很好地工作):
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将目标与目标模式匹配,并使用该模式构造先决条件名称。因此,如果Make使用此规则构建object_dir/foo.o
,则词干将为foo
,前提条件为source_dir/foo.cpp
。(您没有询问
| print-opts
,所以我认为它已经很清楚了。)
关于makefile - Makefile中有多个冒号和等号(需要说明),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11425978/