2008-11-24 103 views

回答

42

http://make.paulandlesley.org/autodep.html有很好的解決方案。

絕對。 g ++ -MM將生成一個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 $< 

這將完成自動生成已更改的每個文件的依賴關係,並根據任何編譯它們規則,你必須到位。這使我可以將新文件轉儲到src /目錄中,並將它們自動編譯爲依賴項和全部。

+1

不要落入這個陷阱,如果你有超過100個文件,因爲它是第一次過慢。在這種情況下,您應該使用一次調用的內容,而不是每個文件一次。 Makedepend可能有這個選項。在工作中,我們使用自定義的perl腳本。 – 2009-03-08 12:57:42

+0

謝謝,我會牢記這一點。我目前的項目有大約十幾個文件,所以沒有大的開銷。此外,最初的構建需要20多分鐘,所以我總是運行它,去喝點咖啡,然後運行增量構建。 – 2009-04-27 11:21:12

+1

謝謝,這真的幫了我。你可以把`$(patsubst src /%,obj /%,$(patsubst%.cpp,%。o,$ <))'寫成`$(patsubst src /%。cpp,obj /%o ,$ <)`。另外,使用選項`-MF $ @`選項而不是使用`> $ @`重定向輸出會更有意義嗎? g ++手冊頁警告你可能在stdout上有一些不需要的調試輸出,但是你不會用`-MF $ @`得到。 – Maarten 2012-04-19 20:26:34

6

GNU C預處理器cpp有一個選項-MM,它可以根據包含模式產生一個適合的依賴關係集。

0

Digital Mars C/C++編譯器附帶makedep工具。

17

現在讀了this portion in particular我認爲有一個更容易的解決方案,只要你有一個合理的最新版本的gcc/g ++。如果你只需要添加-MMDCFLAGS,定義一個變量OBJS代表你的所有目標文件,然後執行:

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

那麼就應該把你倆一種簡單有效的自動的依賴構建系統。

4

我只需添加這makefile文件和它工作得很好:

-include Makefile.deps 

Makefile.deps: 
    $(CC) $(CFLAGS) -MM *.[ch] > Makefile.deps 
相關問題