我想构建一些 C++ 代码。我已经有一个神奇的 Makefile 可以自动计算依赖关系,但我想将目标文件保存在单独的目录中。所以结构看起来像:
- 生成文件
- 来源/a/
- 来源/b/
- 来源/c/
- 对象/
我能够运行使用 obj/ 前缀将源转换为对象的 Makefile,但是当我想反向移植依赖计算时事情变得一团糟。
问题是几乎所有 Makefile 示例都是一步完成的,从 .cpp ( %.d: %.cpp
) 创建 .d。我花了一些时间试图理解 Makefile 并通过反复试验来修复它。最后我有一个工作脚本:
DIRS := a b c
SOURCES := $(foreach dir,$(DIRS),$(wildcard source/$(dir)/*.cpp))
OBJECTS := $(patsubst %.cpp,obj/%.o,$(SOURCES))
obj/%.d: %.cpp
@mkdir -p $(@D)
@$(CXX) -E $(CXXFLAGS) -MM -MP -MF $@ -MQ $(@:.d=.o) -MQ $@ $<
obj/%.o: %.cpp obj/%.d
@$(CXX) $(CXXFLAGS) -o $@ -c $<
project: $(OBJECTS)
...
-include $(OBJECTS:.o=.d)
但我仍然不确定为什么我需要为 cpp->d 和 cpp&d -> o 设置单独的步骤(或者也许我理解 - 但我不知道为什么大多数示例不需要这个)。