GNU make のドキュメントは良い解決策を提供します。
絶対。 g++ -MM <your file>
依存関係の GMake 互換リストを生成します。私はこのようなものを使用します:
# Add .d to Make's recognized suffixes.
SUFFIXES += .d
#We don't need to clean up when we're making these targets
NODEPS:=clean tags svn
#Find all the C++ files in the src/ directory
SOURCES:=$(shell find src/ -name "*.cpp")
#These are the dependency files, which make will clean up after it creates them
DEPFILES:=$(patsubst %.cpp,%.d,$(SOURCES))
#Don't create dependencies when we're cleaning, for instance
ifeq (0, $(words $(findstring $(MAKECMDGOALS), $(NODEPS))))
#Chances are, these files don't exist. GMake will create them and
#clean up automatically afterwards
-include $(DEPFILES)
endif
#This is the rule for creating the dependency files
src/%.d: src/%.cpp
$(CXX) $(CXXFLAGS) -MM -MT '$(patsubst src/%.cpp,obj/%.o,$<)' $< -MF [email protected]
#This rule does the compilation
obj/%.o: src/%.cpp src/%.d src/%.h
@$(MKDIR) $(dir [email protected])
$(CXX) $(CXXFLAGS) -o [email protected] -c $<
注: $(CXX)
/gcc
コマンドの前にハード タブを付ける必要があります
これにより、変更された各ファイルの依存関係が自動的に生成され、設定したルールに従ってコンパイルされます。これにより、新しいファイルを src/
にダンプすることができます ディレクトリに保存し、依存関係などすべてを自動的にコンパイルします。
特にこの部分を読んだので、かなり最新のバージョンの gcc/g++ を持っている限り、はるかに簡単な解決策があると思います。 -MMD
を追加するだけの場合 あなたの CFLAGS
に 、変数 OBJS
を定義します すべてのオブジェクト ファイルを表してから、次の操作を行います。
-include $(OBJS:%.o=%.d)
そうすれば、効率的でシンプルな自動依存関係ビルド システムが得られるはずです。
GNU C プリプロセッサ cpp にはオプション -MM があり、包含パターンに基づいて適切な依存関係のセットを生成します。