2011-06-12 18 views
1

我跟着指示網上建立GCC(實際上G ++)生成.D依賴項文件的時間徹底改造項目,現在我的makefile文件看起來是這樣的:使用GCC相關文件的原因讓每一個

CPPFLAGS := ... -MMD -MP 
... 
OBJECTS := $(shell find *.cpp *.s | sed -e 's/\.cpp/\.o/' -e 's/\.s/\.o/') 
all: setupdir $(OBJECTS) link image 

,然後在文件的結尾:

-include $(pathsubst %.d,obj/%.d,$(OBJECTS:.o=.d)) 

的.d文件是否被正確生成,並且所有在obj的目錄顯示出來。現在的問題是,即使沒有爲它們生成.d文件的程序集文件,每次運行make時都會重建整個源代碼樹。該項目不需要很長時間進行編譯,但是仍然會如何解決這個問題,以便make正確運行?

+2

'make -d'會將make放在「調試模式」中,並告訴你爲什麼它正在做它正在做的事情。這是很多的輸出,所以它很難閱讀,但信息在那裏... – Nemo 2011-06-12 23:59:11

+2

「在線說明」?啊,互聯網......那個衆所周知的,集中的,無重複的,矛盾的,緊密的技術資源! – 2011-06-13 00:44:21

+0

@Tomalak - 謝謝你的高高興興:) – 2011-06-13 00:46:40

回答

1

重要的是要注意-M對於依賴關係來說不是靈丹妙藥,在很多情況下,你需要指定某些標題,以便在事物發生變化時重新構建。實際上,讓gcc處理依賴關係最常見的問題是不應該重新構建應該(根據運行make的人使用的GCC版本)。

這就是說,我沒有看到任何明顯的錯誤,你在做什麼。

我推薦做的事情是消除shell技巧,因爲很容易指定你想要的東西。例如。

foo_SOURCES = \ 
    src/foo.cpp \ 
    src/bar.cpp 

foo_OBJECTS = $(foo_SOURCES:.cpp=.o) 

foo_DEPS = $(foo_OBJECTS:.o=.d) 

%.o : %.cpp 
    $(CC) $(CFLAGS) ... $< -o [email protected] 
    $(CC) -M $< > $(@.o=.d) 

# lots more rules and targets here 

# and finally, at the bottom: 

-include $(foo_DEPS) 

這是關閉我的頭在元形式,所以檢查它是肯定的。我相信你的問題實際上是沒有包含的依賴關係,但我沒有看到你使用pathsubst的方式有什麼明顯的錯誤。

正如人們在評論中指出的那樣,在調試時運行make可能會有所幫助,但是第一步的好的一步是指定對象和依賴關係,而不用與shell進行交談。

如果你得到這個工作,試着存儲你的shell調用結果並將它們回顯到屏幕上。這比make的調試輸出噪聲小得多。

+0

那麼,從make調試輸出,它似乎沒有找到目標文件...是否有一個命令,使其在某個目錄中查找輸出文件? – Eli 2011-06-13 04:34:43

+1

嗯,我發現了一個明顯的問題......我寫了pathsubst而不是patsubst ...另外,它試圖在主目錄中找到目標文件,當它們位於obj文件夾中時。 – Eli 2011-06-13 05:09:46

+0

感謝您的幫助!我添加了$(CC)-M ...行,順便說一句,它應該有一個:@和.o之間,並在文件頂部添加VPATH =:obj /,並且它工作正常! – Eli 2011-06-13 05:26:10

相關問題