使用MakeFile创建目录

使用MakeFile创建目录,makefile,Makefile,我写了一个MakeFile,但我需要它来创建文件夹OBJ,所以,为此,我尝试了很多方法。。。基于此链接: 这就是我的makefile IDIR =. CC=gcc CFLAGS=-I$(IDIR) -Wall -g SRCDIR=src ODIR=obj LIBS=-ltest _OBJ = main.o OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ)) OUTPUTDIR = ../bin $(ODIR)/%.o: $(SRCDIR)/%.c $(

我写了一个MakeFile,但我需要它来创建文件夹OBJ,所以,为此,我尝试了很多方法。。。基于此链接:

这就是我的makefile

IDIR =.
CC=gcc
CFLAGS=-I$(IDIR) -Wall -g

SRCDIR=src
ODIR=obj
LIBS=-ltest

_OBJ = main.o 
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))

OUTPUTDIR = ../bin

$(ODIR)/%.o: $(SRCDIR)/%.c
    $(CC) -c -o $@ $< $(CFLAGS)

$(OUTPUTDIR)/test: $(OBJ) 
    $(CC) -o $@ $^ $(CFLAGS) $(LIBS)
但显然,每次我调用makefile时,它都忽略了创建目录OBJ的命令,并开始直接编译

如何创建目录?

尝试以下操作:

OBJDIR := objdir
OBJS := $(addprefix $(OBJDIR)/,foo.o bar.o baz.o)

$(OBJDIR)/%.o : %.c
    $(COMPILE.c) $(OUTPUT_OPTION) $<

all: $(OBJS)

$(OBJS): | $(OBJDIR)

$(OBJDIR): FORCE
    mkdir -p $(OBJDIR)

FORCE:
OBJDIR:=OBJDIR
OBJS:=$(addprefix$(OBJDIR)/,foo.o bar.o baz.o)
$(OBJDIR)/%.o:%.c
$(COMPILE.c)$(输出选项)$<
全部:$(OBJS)
$(OBJS):|$(OBJDIR)
$(OBJDIR):强制
mkdir-p$(OBJDIR)
部队:

另一种方法是使用一个伪变量,该变量在分析Makefile的早期进行计算,并生成所需的文件夹

   ODIR = obj_64
   dummy_build_folder := $(shell mkdir -p $(ODIR))
然后,Makefile的其余部分可以安全地假设$(ODIR)存在


我已经在各种Linux版本和Solaris以及GNU Make 3.81上使用过它。

它的可能副本真的不清楚为什么该页面是一个有用的链接。如果您定义
OUT\u DIR=${ODIR}
或其他合适的值,最后一个片段将起作用。中间片段中的管符号令人费解;我想我以前没有见过这种符号。@JonathanLeffler:管道表明
$(OBJDIR)
是一个,因此如果重建目标,它将被重建,但目标不需要重建,仅仅因为需要重建这个prereq。可能是
OBJDIR := objdir
OBJS := $(addprefix $(OBJDIR)/,foo.o bar.o baz.o)

$(OBJDIR)/%.o : %.c
    $(COMPILE.c) $(OUTPUT_OPTION) $<

all: $(OBJS)

$(OBJS): | $(OBJDIR)

$(OBJDIR): FORCE
    mkdir -p $(OBJDIR)

FORCE:
   ODIR = obj_64
   dummy_build_folder := $(shell mkdir -p $(ODIR))