makefile - Makefile中有多个冒号和等号(需要说明)

标签 makefile

这只是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/

相关文章:

Linux:.c 和 Makefile "How to create the .s and .o file so that I can use "make“在终端中?”

ios - 将 GCC makefile 脚本转换为 LLVM 3.0 编译器

linux - cpanm perl 模块安装在 'make' 和 'make test' 上失败

c++ - KDE 应用程序在 'make install' 之后无法安装

makefile - @…@在此Makefile代码段中是什么意思?

c++ - 编译 nana 库时不能包含 <X11/Xft/Xft.h>,没有那个文件或目录

python - Makefile:如果存在则使用 $exe1 否则使用 $exe2

makefile - 在运行时使用 makefile 复制文件

c - GCC: undefined reference (Makefile 问题)

go - 从交叉编译的二进制文件构建RPM软件包Go app tarball