';%的语义是什么';在Makefile中?

';%的语义是什么';在Makefile中?,makefile,gnu-make,Makefile,Gnu Make,谷歌搜索对于理解下面的Makefile代码段中如何使用%变量没有多大帮助 _OBJ = a.o b.o c.o OBJ = $(patsubst %,$(OBJDIR)/%,$(_OBJ)) $(OBJDIR)/%.o: $(SRCDIR)/%.c $(INC) $(CC) -c -o $@ $< $(CFLAGS) \u OBJ=a.o b.o c.o OBJ=$(patsubst%,$(OBJDIR)/%,$(_OBJ)) $(OBJDIR)/%.o:$(SRCDIR)/%

谷歌搜索对于理解下面的Makefile代码段中如何使用
%
变量没有多大帮助

_OBJ = a.o b.o c.o
OBJ = $(patsubst %,$(OBJDIR)/%,$(_OBJ))

$(OBJDIR)/%.o: $(SRCDIR)/%.c $(INC)
    $(CC) -c -o $@ $< $(CFLAGS)
\u OBJ=a.o b.o c.o
OBJ=$(patsubst%,$(OBJDIR)/%,$(_OBJ))
$(OBJDIR)/%.o:$(SRCDIR)/%.c$(INC)
$(CC)-c-o$@$<$(CFLAGS)
谁能帮帮我吗?这是否意味着如果在
$(SRCDIR)
下存在五个
.c
文件,那么许多
*.o
规则都在幕后填充?

这是一个“”。
%
使单词
$(OBJDIR)/%.o
成为一种模式。它告诉make如果它试图构建一个目标,并且目标的名称与该模式匹配(其中
%
可以替换一个或多个字符——任何字符),并且与该模式匹配的文件
$(SRCDIR)/%.c
(其中
%
与目标中的值相同)要么已经存在,要么可以构建,然后make可以使用此配方构建该目标

因此,如果make想要构建一个文件
foo/bar.o
,并且变量
OBJDIR
的值为
foo
,那么这个模式
foo/%.o
将该文件与
%
匹配的
bar
(在GNU make文档中称为stem)


然后,如果
SRCDIR
具有值
blah
,并且make可以找到(或创建)一个名为
blah/bar.c
的文件,那么这个隐式规则可以通过运行这个配方(
$(CC)-c-o$$$<$(CFLAGS)
)来构建目标
foo/bar.o

完美,与示例结合使用,完全有意义。