39

依存関係が壊れているメイクファイルを含むプロジェクトがあります。各ソース ファイルを手動で、または手書きの perl スクリプトで調べる以外に、makefile で使用できるプロジェクトの依存関係のリストを生成する最もよく知られている方法はありますか?

4

5 に答える 5

54

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 $@

#This rule does the compilation
obj/%.o: src/%.cpp src/%.d src/%.h
    @$(MKDIR) $(dir $@)
    $(CXX) $(CXXFLAGS) -o $@ -c $<

注: $(CXX) /コマンドの前にハードタブを付けるgcc必要があります

これにより、変更された各ファイルの依存関係が自動的に生成され、設定したルールに従ってコンパイルされます。これにより、新しいファイルをディレクトリにダンプしsrc/、依存関係などすべてを自動的にコンパイルすることができます。

于 2008-11-24T09:56:04.327 に答える
21

特にこの部分を読んだので、かなり最新のバージョンの gcc/g++ を持っている限り、はるかに簡単な解決策があると思います。-MMDに追加するだけの場合は、すべてのオブジェクト ファイルを表すCFLAGS変数を定義してから、次のようにします。OBJS

-include $(OBJS:%.o=%.d)

そうすれば、効率的でシンプルな自動依存関係ビルド システムの両方が得られるはずです。

于 2012-04-16T03:29:26.220 に答える
7

GNU C プリプロセッサ cpp にはオプション -MM があり、包含パターンに基づいて make-suitable 依存関係のセットを生成します。

于 2008-11-24T09:52:45.583 に答える
5

これをメイクファイルに追加するだけで、うまく機能します。

-include Makefile.deps

Makefile.deps:
    $(CC) $(CFLAGS) -MM *.[ch] > Makefile.deps
于 2012-11-24T21:04:28.947 に答える
0

Digital Mars C/C++ コンパイラには、makedepツールが付属しています。

于 2008-11-25T16:28:26.733 に答える