多个冒号和makefile中的等号(需要说明)

qin*_*oon 7 makefile

这只是一个makefile的一部分.我不太明白发生了什么.

OBJS = $(SRCS:$(SRC)/%.cpp=$(OBJ)/%.o)
$(OBJS):$(OBJ)/%.o: $(SRC)/%.cpp | print-opts
    $(cc-command)
Run Code Online (Sandbox Code Playgroud)

我理解的是这些行在'print-opts'之后用'cc-command'将.cpp文件编译成.o文件.但我不懂语义.

如果我展开'OBJS'的宏,这一行应该是:

$(SRCS:$(SRC)/%.cpp=$(OBJ)/%.o) : $(OBJ)/%.o: $(SRC)/%.cpp | print-opts
    $(cc-command)
Run Code Online (Sandbox Code Playgroud)

对我来说,它看起来像'$(SRCS:$(SRC)/%.cpp = $(OBJ)/%.o)',它声称$(SRC)中的所有.cpp将以$($)来兑换. OBJ),但这取决于$(OBJ)/%.o,这取决于$(SRC)/%.cpp.这没有意义......

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

Bet*_*eta 17

假设您已经定义了这三个变量(如果没有,那么规则将无法正常工作):

SRC = source_dir
OBJ = object_dir
SRCS = source_dir/foo.cpp source_dir/bar.cpp
Run Code Online (Sandbox Code Playgroud)

现在考虑分配

OBJS = $(SRCS:$(SRC)/%.cpp=$(OBJ)/%.o)
Run Code Online (Sandbox Code Playgroud)

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

现在规则:

$(OBJS):$(OBJ)/%.o: $(SRC)/%.cpp | print-opts
    $(cc-command)
Run Code Online (Sandbox Code Playgroud)

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

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