2010-07-16 71 views
1

我正在使用打算自動生成依賴關係的makefile。但對於我的文件,我發現雖然對頭文件的更改會導致代碼重新編譯,但它們不會導致重新生成依賴關係,因爲我認爲它們應該這樣做。任何人都可以看到我錯過了什麼嗎?Makefile依賴關係生成不檢查標頭

.SUFFIXES : .hpp .cpp .d .o 
SOURCES=main.cpp sub1.cpp sub2.cpp 
OBJECTS=${SOURCES:.cpp=.o} 
DEPENDENCIES=${SOURCES:.cpp=.d} 

.cpp.d: 
    g++ -MM $< > [email protected] 
.cpp.o: 
    g++ $< -c `pkg-config gtkmm-2.4 --cflags --libs` -g 

calculator: ${OBJECTS} ${DEPENDENCIES} 
    g++ ${OBJECTS} -o calculator `pkg-config gtkmm-2.4 --cflags --libs` -g 

include ${DEPENDENCIES} 
+0

這是棘手。我會等待profi迴應。問題的關鍵(顯然).d依賴於.cpp,並忽略頭文件的更改。所以從某種意義上說,.d必須依賴於.d ....依賴性是我不使用make的所有原因之一。 – Dummy00001 2010-07-16 10:57:32

回答

1

我自己找到解決方案。技巧也出現在official GNU make documentation

產生依賴性應該看起來像行:

.cpp.d: 
     g++ -MM $< | sed 's!^$(<:.cpp=.o):!$(<:.cpp=.o) $(<:.cpp=.d):!' > [email protected] 

桑達從翻譯的依賴行「main.o:main.cpp中包括/ hello.hpp」到「main.o爲主。 d:main.cpp include/hello.hpp「(例如我最小化的測試),因此.d依賴於與.o文件本身相同的文件。

雖然我個人建議使用例如SCons這是能夠自動依賴性跟蹤,因爲(根據我的經驗),當引入新的頭文件或重命名某些文件時,GNU make解決方案經常會中斷。

+0

謝謝,Dummy00001。這似乎已經成功了。 – 2010-07-16 11:30:20

1

雖然我同意Dummy00001的解決方案,但它可能有助於向g ++命令添加-MP標誌以生成依賴文件。它所做的是將PHONY目標與依賴列表中所有頭文件的名稱相加。

也就是說,如果g++ -MM $<產生

test.o: test.cpp test.h dummy.h etc_bkp.h 

然後g++ -MM -MP $<產生

test.o: test.cpp test.h dummy.h etc_bkp.h 
test.h: 
dummy.h: 
etc_bkp.h: 

這將有助於作出不予打破即使重命名完成或文件已被刪除

+0

謝謝vamsi。我會研究一下。 – 2011-05-23 07:36:13