2012-05-17 24 views
7

我有一個項目,我經常修改標題,當我這樣做,並忘記make clean然後make,我得到各種奇怪的行爲。我目前正在使用Qt Creator作爲我的IDE,但是我發現這發生在一個獨立於Qt的項目上。我的項目變得相當龐大,每當我改變標題時都不得不重建。有什麼想法嗎?修改後不重建標題

以供將來參考:

如果使用QMAKE系統:

 
DEPENDPATH += . \ 
    HeaderLocation1/ \ 
    HeaderLocation2/ \ 
    HeaderLocation2/HeaderSubLocation1/ \ 
    HeaderLocation2/HeaderSubLocation2/ \ 
    HeaderLocation2/HeaderSubLocation3/ \ 
    HeaderLocation2/HeaderSubLocation4/ \ 
    HeaderLocation2/HeaderSubLocation5/ \ 
    HeaderLocation3/ \ 
    HeaderLocation3/HeaderSubLocation1/ \ 
    HeaderLocation3/HeaderSubLocation2/ \ 
+0

怪異的行爲的,我還沒有在年齡突然拋出的錯誤,甚至庫代碼拋出內部錯誤將自己修改的代碼爲隨機位.. – Drise

+0

這聽起來像你錯過了標題的一些依賴。 – juanchopanza

+0

需要注意的事項:我的make文件是由QMake根據我的Qt .pro文件自動生成的。修改我的Makefile不是一種選擇,因爲當.pro文件更改時,會重新創建Makefile。 – Drise

回答

3

不知道你的IDE有什麼問題,也不知道它是否相關,因爲你不包括你的makefile - 我只會說明顯而易見的 - 你使用任何自動生成的依賴關係嗎?

對於G ++我使用-MD標誌,那麼在makefile包括$(wildcard bin/*.d)(取決於創建目標文件,其中,礦「本」創建)

同時一定要刪除一個的DEP文件clean build

+1

我相信你有最好的答案,因爲它的確讓我更多地瞭解了QMake的生成系統,以及如何在Qt .pro文件中設置依賴關係。 – Drise

1

這主要是由於文件之間的依賴關係。因此,如果您更改另一個包含的.h文件,那麼該文件也需要重新編譯。因此,無論您需要減少包含,還是儘可能以.h/.cpp格式編寫代碼,以便比.h更頻繁地更改.cpp。

+0

另外需要注意的是,如果您在製作系統中正確設置了依賴關係,那麼您並不總是需要每次都進行清理,而只需要在更改.h文件中包含的內容時進行清理。 – pippin1289

+0

我在.cpp文件中完成了大部分工作。但是,如果我需要爲一個類添加一個新的函數,或者添加一個新的私有變量,我必須在標題中更改它。 – Drise

+0

當然,那麼因爲依賴關係,包含它的任何東西都會被重新編譯,所以減少文件之間的依賴關係可能會有所幫助。比如小心包含在.h文件中不必要的原因可能會在其他文件中產生依賴關係。我通常會嘗試只包含在.cpp中。 – pippin1289

2

解決方案是在你的makefile中有適當的頭文件依賴項。

1)使用makedepend生成依賴文件。你可以在你的makefile中添加一個目標文件來重新產生依賴文件,並且你希望在實際編譯之前調用它。 2)僅GCC:在編譯行上爲.c/.cpp文件使用'-MMD'和'-MP'選項。這導致GCC爲輸入文件生成一個依賴文件。然後,你可以將這些包含在makefile中。這樣做的好處是,通過這兩個選項,當您添加和刪除標題時,它應該按照您的預期行事。

+0

還沒用多年,'makedepend'可以嚴重減慢你的編譯...所以我會說盡可能地離開 – nhed

1

這是我自己的makefile的一個摘錄,用於生成和使用在編譯過程中自動創建的依賴文件。你將不得不作出cpp文件也追記

%.o : %.c 
    $(CC) -M $(CFLAGS) -o $*.P $< 
    @cp $*.P $*.d; \ 
      sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ 
       -e '/^$$/ d' -e 's/$$/ :/' < $*.P >> $*.d; \ 
      rm -f $*.P 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

-include *.d 

不要忘記添加刪除乾淨構建

5

重辦qmake * .d文件。這將生成一個新的Makefile,它將具有適當的依賴關係。

例子:

的文件file.h看起來像以下:

#include "some.h" 
#include "header.h" 
#include "files.h" 
... 

file.cpp看起來像以下:

#include "file.h" 
... 

,並在你的.pro

HEADERS += file.h some.h header.h files.h 
SOURCES += file.cpp 

會產生所產生的Makefile如下:

file.o: ../src/file.cpp ../src/file.h \ 
     ../src/some.h \ 
     ../src/header.h \ 
     ../src/files.h 
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o file.o ../src/file.cpp 
+0

這就是答案!當運行「make」並將新的頭文件添加到QMake文件時,從QMake文件生成的Makefile會自動更新自身。但是,如果新頭文件不包含在.cpp文件中,那麼就不會計算依賴關係更新,並且之後需要手動重新運行qmake。 – DCTLib