2011-02-02 55 views
6

我編寫了一個腳本,用於生成帶有常量(如版本,svn標記,內部版本號)的頭文件。然後,我有一個類創建一個包含這些信息的字符串。如何最小化C++編譯時間

我的問題如下:由於該文件是在每個編譯中創建的,因此編譯器會檢測到該標題已更改,並強制重新編譯大量文件。我想這個問題是在頭文件的情況。我的項目是一個庫,頭文件必須位於「世界接口」頭文件中(它必須公開)。

我需要一些建議,以儘量減少此編譯時間或減少強制重新編譯的文件。

+1

編譯器通常不會「檢測」其他文件已更改,並會觸發重新編譯。這是一個更高級別的功能,通常由IDE和/或構建系統本身(如Make&co)更明確地實現。 – unwind 2011-02-02 10:12:47

+0

@unwind:你不是真的。一些編譯器可以檢測到。 – 2011-02-02 10:15:28

回答

12

在標題中寫類似:

extern const char *VERSION; 
extern const char *TAG; 
extern const char *BUILD_DATE; 

,並創建一個.C(或。將包含

const char *VERSION = "0.13"; 
const char *TAG = "v_0_13"; 
const char *BUILD_DATE = "2011-02-02 11:19 UTC+0100"; 

如果你的腳本更新.c文件CPP)文件,只有文件將被重新編譯,但包括你的頭文件不會。

4

生成實現文件中的常量。

確保您的腳本不會更改標題。

3

解決此問題的最簡單方法是不要在頭文件中生成這些常量。相反,在獲取這些值的頭文件中創建函數。然後將這些值本身放置在一個實現這些函數的小cpp文件中。 (或者將它們放置在僅包含在該cpp文件中的標題中)。當你重新編譯時,只有那一個文件需要重新編譯。

此外,如果您有幾臺機器可以備用,您可以查看distcc以加快編譯速度。

1

如果你想保持它作爲一個公頭,你可以添加一個預構建的步驟,把你的公共頭文件和

  • 篩選出的版本細節,無論是刪除它們或替換它們一個固定的字符串,到文件的臨時副本
  • 只有當它已經改變時,纔將它移動到你的頭文件的內部版本,即不要複製文件(+更新時間戳),除非版本以外的東西已經改變

然後建立你的precompi從這個內部頭文件中導出頭文件。您仍然可以使用公共標題以及需要該版本的源文件的版本詳細信息。

如果您使用的是unix,那麼您可以借用GCC源代碼中的moveifchanged腳本,或者您可以在Windows上的批處理文件中使用fc來安裝某些東西。

1

面向對象的解決方案:

一般來說,你應該把那些經常刷新cnstants CPP的文件,而不是小時。把它們放入一個班級。如果你已經有一個類創建它們的字符串並通過方法發佈它,我會把所有這些常量放在同一個cpp中,並添加一些公共方法從其他源文件訪問它們。

3

如果您使用的是gcc,您可以嘗試使用ccache。它緩存對象基於預處理輸出的哈希文件,這樣就不會重新編譯,除非實際發生更改

2

另一種方式是像聲明的extern const double PI;常數值在你喜歡「my_constants.h」的標題,並添加一個CPP文件到該項目中包含的內容:

#include "my_constants.h" 

const double PI = 3.1415926535; 

那麼實際值僅是編譯一次,更改值只需要編譯該單個文件並重新鏈接項目。