2016-07-27 1 views
0

私のMakefileは以下の通りですが、私はauto-dependenciesに.dファイルを使用しましたが、いくつかの.hファイルを修正したばかりで、それは奇妙です。 %.oがそれに依存しないので、あなたがなぜ私のMakefileの自動依存関係が機能しないのですか

PROGRAM := a.out 
SRCDIRS := ./src/access 
INCLUDE := -I./include/access 
SRCEXTS := .cpp 
CPPFLAGS := -g -Wall 
LDFLAGS := 

CXX  = g++ 
RM  = rm -f 

SHELL = /bin/sh 
SOURCES = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS)))) 
OBJS = $(foreach x,$(SRCEXTS), \ 
     $(patsubst %$(x),%.o,$(filter %$(x),$(SOURCES)))) 
DEPS = $(patsubst %.o,%.d,$(OBJS)) 
.PHONY : all objs clean cleanall rebuild 
all : $(PROGRAM) 


objs : $(OBJS) 
%.o : %.cpp 
    $(CXX) -c $(CPPFLAGS) $< -o [email protected] $(INCLUDE) 

$(PROGRAM) : $(OBJS) 
    $(CXX) -o $(PROGRAM) $(OBJS) $(LDFLAGS) 
rebuild: clean all 
clean : 
    @$(RM) $(OBJS) $(DEPS) 
cleanall: clean 
    @$(RM) $(PROGRAM) 

-include $(DEPS) 
%.d : %.cpp 
    rm -f [email protected]; $(CXX) -MM $< $(INCLUDE) > [email protected]$$$$; \ 
    sed 's,\($*\)\.o[ :]*,\1.o [email protected] : ,g' < [email protected]$$$$ > [email protected]; \ 
    rm -f [email protected]$$$$ 
+0

古代の依存関係生成コードの使用を中止するには、GCCに[MMD'と 'MP'](http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/)のようなフラグがあります15 years – user657267

答えて

0

を助けるためのおかげで実行するように%.dパターンの原因となるものは何もありません。だからあなたのmakefileごとに、Makeは単にディスクに既にあるファイル$(DEPS)を使います。

依存関係を宣言すると、%.dファイルはそれに依存するものが必要な場合にのみ再生され、対応する%.cppファイルが変更されています。

%.oに依存性を追加すると、必要な依存関係が追加されるはずですが、まだ%.d-includeより前に実行されていることを確認する必要があります。

理想的には、各%.dファイルは、対応する%.cppファイルをファイルどんな%.hに依存すべきで依存しますが、鶏と卵の問題への解決策慣習は、より頻繁に厳密に必要以上%.dファイルを再構築する強制することです。

+0

トピックの詳細については、たとえばhttp://stackoverflow.com/questions/297514/how-can-i-have-a-makefile-automatically-rebuild-source-files-that-include-a-modi – tripleee

関連する問題