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

标签 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 文件夹中。谁能给点建议?

最佳答案

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

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

关于c++ - 将目标文件放入单独的文件夹中 GNU make,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38753546/

相关文章:

c++ - 如何将此 C++ 类型列表构建为变体?

c++ - MongoDB C++ 驱动断言失败

c - makefile错误缺少分隔符错误

c++ - 编写没有主体的循环的最佳方法是什么

c++ - OpenGL-使用.obj/.mtl中的图像纹理绘制对象

c++ - #include <图形.h>

c++ - 如何让cmake使用ubuntu系统以外的另一个opencv目录?

linux - 如何将 "-fstack-protector-all"添加到 makefile?

c - gcc 编译器和 makefile : error: expected identifier or ‘(’ before ‘&’ token

python - 如何执行 makefile 来重新编译 django oscar 资源?