我有以下目录结构:
./
|- obj/
|--- debug/
|--- release/
|- bin/
|--- debug/
|--- release/
|- src/
|--- main.c
|--- libb/
|----- foo.c
|- include/
|--- libb/
|----- foo.h
此外,我Makefile
以以下格式(示例)手动指定单个对象的依赖关系:
main_DEPS = libb/foo
现在我希望能够输入make bin/debug/main
,这会生成必要的依赖项和目标文件:
obj/debug/libb/foo.o
obj/debug/main.o
bin/debug/main
我怎么做?我目前的方法非常复杂且不完整:
下面创建目标文件。
libb
但是,如果它们尚不存在,则无法创建任何必要的子文件夹 ( )。它也不跟踪任何更改的头文件。可以调整自动生成先决条件的Makefile 教程技巧吗?CFLAGS+=-I include obj/*/%.o: src/%.cpp $(CC) $(CFLAGS) $< -c -o $@
以下尝试解决二进制文件的依赖关系并从所有必需的目标文件构建它。但我不知道如何从
*_DEPS
变量中检索这些目标文件。.SECONDEXPANSION: bin/debug/%: obj/debug/%.o $(patsubst %,obj/debug/%.o,$($(patsubst bin/debug/%,%,$@)_DEPS)) $(LD) $(LDFLAGS) $< $(patsubst %,obj/debug/%.o,$($(patsubst bin/debug/%,%,$@)_DEPS)) -o $@ bin/release/%: obj/release/%.o $(patsubst %,obj/release/%.o,$($(patsubst bin/release/%,%,$@)_DEPS)) $(CXX) $(LDFLAGS) $< $(patsubst %,obj/release/%.o,$($(patsubst bin/release/%,%,$@)_DEPS)) -o $@
不幸的是,这不会自动构建依赖关系:它只是抱怨“obj/debug/libb/foo.o:没有这样的文件或目录”——但如果我使用
mkdir obj/debug/libb; make obj/debug/libb/foo.o
.它也非常复杂,并且使用了无缘无故的代码重复(如果不让它变得更加复杂,我就无法摆脱它)。
最简单的解决方案是什么?原则上,我不反对使用其他东西,make
除非它可以广泛使用(autoconf ...),但我更喜欢将努力(以及所需的新学习)保持在最低限度,并且从我迄今为止所看到的所有其他构建系统似乎比 复杂得多make
。