C++ コードを作成したかったのです。依存関係を自動的に計算できる魔法の Makefile を既に持っていましたが、オブジェクト ファイルを別のディレクトリに保持したかったのです。したがって、構造は次のようになります。
- Makefile
- ソース/a/
- ソース/b/
- ソース/c/
- オブジェクト/
obj/ プレフィックスを使用してソースをオブジェクトに変換する Makefile を実行することはできましたが、依存関係の計算をバックポートしたいときに事態が混乱しました。
問題は、ほとんどすべての Makefile の例が、.cpp から .d を作成する 1 つのステップで行われていることです ( %.d: %.cpp
)。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 に対して別々の手順を実行する必要があるのか 、まだわかりません(または、理解できるかもしれませんが、ほとんどの例でこれが必要ない理由がわかりません)。