我对makefile的第一条规则的理解正确吗?
我正在学习make,并试图从中理解以下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。然后,由于
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)