将目标文件放入GNU make的单独文件夹中

时间:2016-08-03 21:00:40

标签: c++ makefile

我正在尝试将目标文件(.o文件)生成到单独的文件夹中。它运作良好。问题是生成的目标文件没有放入我想要的文件夹中。以下是我的makefile:

OBJDIR :=objdir
SOURCES=$(wildcard ./src/*.c)
OBJS=$(patsubst %.c, %.o, $(SOURCES))
vpath %.h ./src
vpath %.c ./src
optest : $(OBJS)
    cc -o optest $(OBJS)
$(OBJDIR)/main.o : add.h mul.h did.h
$(OBJDIR)/add.o : add.h
$(OBJDIR)/mul.o : mul.h
$(OBJDIR)/did.o : did.h

$(OBJS): | $(OBJDIR)

$(OBJDIR):
    mkdir $(OBJDIR)


clean :
    rm -rf $(OBJDIR)
    rm -f optest

我的.h和.c文件放在./src文件夹中。上面makefile的结果是所有目标文件也放在./src文件夹而不是objdir文件夹中。任何人都可以提出任何建议吗?

1 个答案:

答案 0 :(得分:1)

两个问题:您没有正确替换源文件,而隐式编译规则仅适用于具有匹配路径的对象和源。

objdir  := objdir
sources := $(wildcard src/*.c)
objs    := $(sources:src/%.c=$(objdir)/%.o)
deps    := $(objs:.o=.d)

CPPFLAGS := -MMD -MP

.PHONY: clean

optest: $(objs)
    $(LINK.o) $^ $(LDLIBS) -o $@

$(objs): $(objdir)/%.o: src/%.c | $(objdir)
    $(COMPILE.c) $(OUPUT_OPTION) $<

$(objdir): ; mkdir $@

clean: ; $(RM) $(objs) $(deps) optest

-include $(deps)

其他东西:

  • 回收内置食谱而不是滚动自己的
  • 使用依赖关系生成,而不是手动指定每个依赖关系
  • 不要删除整个目录,即使你创建了它们,也要坚持使用makefile负责的文件
  • 实际上不会生成文件的规则应为.PHONY