我对makefile的第一条规则的理解正确吗?

我对makefile的第一条规则的理解正确吗?,makefile,Makefile,我正在学习make,并试图从中理解以下makefile OBJDIR:=OBJDIR OBJS:=$(addprefix$(OBJDIR)/,foo.o bar.o baz.o) $(OBJDIR)/%.o:%.c $(COMPILE.c)$(输出选项)$< 全部:$(OBJS) $(OBJS):|$(OBJDIR) $(OBJDIR): mkdir$(OBJDIR) 第一条规则把我弄糊涂了。这是第一次应用。由于不存在$(OBJDIR),最后一条规则将应用于mkdir OBJDIR。然后,由于

我正在学习make,并试图从中理解以下makefile

OBJDIR:=OBJDIR
OBJS:=$(addprefix$(OBJDIR)/,foo.o bar.o baz.o)
$(OBJDIR)/%.o:%.c
$(COMPILE.c)$(输出选项)$<
全部:$(OBJS)
$(OBJS):|$(OBJDIR)
$(OBJDIR):
mkdir$(OBJDIR)
第一条规则把我弄糊涂了。这是第一次应用。由于不存在
$(OBJDIR)
,最后一条规则将应用于mkdir OBJDIR。然后,由于新创建的目录中没有任何内容,因此没有stem.o,相应地,也没有stem.c,因此前提条件和食谱似乎没有意义


第一条规则所做的唯一一件事就是创建一个似乎不真实的目录。

我真的不明白你的逻辑

makefile中的第一条规则是:

all: $(OBJS)
因此,这个makefile的默认目标(如果您没有在命令行中指定一个)是
all

all
取决于所有
.o
文件。所有
.o
文件都对目录具有仅顺序依赖关系。因此,首先创建目录,然后创建
.o
文件,然后完成
所有的
(这里没有创建程序或库或使用这些
.o
文件的方法)

  • 第一个规则是,因此不能是默认规则;除非您指定(例如,
    make thing.o
    ),否则它不会是第一次应用


  • 第一条规则可能不符合您的期望。配方是
    $(COMPILE.c)$(OUTPUT\u选项)$谢谢!非常全面。您使用的成语
    default rule
    启发我发现
    有两个例外默认目标是第一个makefile中第一个规则的目标。
    all: $(OBJS)