2014-11-04 53 views
6

我的代碼一直使用libcxx,sdl和其他一些庫。我怎麼能生成.pch考慮到每個頭可以包含一些其他頭(即使有複雜的條件,如#ifdef #include #endif。這就是爲什麼很難理解需要的頭文件列表。我應該只使用所有頭文件該文件夾來創建.pch?那麼這種.pch性能的用法如何?如何爲許多標題生成.pch?

更新:如果它很重要我將用它與鏗鏘。 UPDATE2:單頭文件

我已經創建PCH:

MBA-Anton:pch asmirnov$ clang++ -x c++-header header.h -emit-pch -o header.pch 
MBA-Anton:pch asmirnov$ clang++ -include-pch header.pch source.cpp -o source -x c++ 

但我無法生成多個文件的PCH:

MBA-Anton:pch asmirnov$ clang++ -x c++-header header.h header2.h -emit-pch -o headers.pch 
clang: error: cannot specify -o when generating multiple output files 
+0

我想我讀了某處gcc的STL是以某種方式預編譯的。有人可以證實這一點嗎? – alfC 2014-11-04 09:34:01

回答

1

首先,我不僅與微軟編譯器所使用的PCH與海灣合作委員會。

#ifdef等條件在編譯之前全部解決,因此如果您更改預處理器變量,則無論如何都會編譯PCH文件。 因此,只需添加您需要的庫的所有文件即可。

一般來說,包括所有不常更改的頭文件(即外部庫文件和系統中穩定的部分)。

不要過多地在你的pch文件中多次包含標題。由於該文件不會經常編譯,因此您可以忽略較高的編譯時間。

我不確定的是,如果在您的pch文件中包含所有內容時,可執行文件的大小會變大。這可能是這種情況,因爲你引用了另外一些沒有使用的代碼部分,它們只會被編譯到你的可執行文件中,因爲你已經將它們添加到你的pch文件中。 你可能想要測試一下。

現在,從我的經驗來看,另一個重要問題是如果編譯時或編譯時的編譯性能較差。

當您的鏈接時間較長時,問題更可能是您的代碼中的標頭中包含過多的標頭。

這可以通過在頭文件中使用Forward聲明進行優化,並且只包含.cpp文件中的頭文件。我們擁有龐大的整體項目,每次編譯/鏈接最大的性能提升都是通過儘可能多地去除前向聲明來消除頭依賴。

這是因爲增量編譯工作得很好,但增量鏈接不能。

這是該做的關於提前聲明很短,但良好的編譯和注意事項: http://www.chromium.org/developers/coding-style/cpp-dos-and-donts

+0

在我的情況下使用.pch的主要目標是減少編譯/鏈接時間,因爲標題列表始終是相同的。我不擔心多次包含某些標題,但是擔心在pch文件中添加不需要的標題。這就是問題所在。 – 4ntoine 2014-11-04 13:52:43

2

GCC編譯器只與一個單一的包括預編譯的頭as explained in this answer效果很好。所以,如果你想在GCC使用PCH,你需要爲你的應用程序的所有翻譯單元一個頭文件(和他們每個人都應該正好與#include指令啓動)

我猜測這種情況對於支持一些預編譯頭文件的其他編譯器也有幫助。

C++標準的未來版本(post C++14)可能會定義一個模塊機制。見例如n4047建議。

請注意,預編譯頭文件是非常特定於編譯器的(使用GCC,當從GCC 4.9.1到GCC 4.9.2時,它們甚至可能不工作),所以您不應該太依賴它們。

+0

感謝有關gcc的信息。實際上,我不得不補充說,我需要它的鏗鏘聲,但我不知道它很重要 – 4ntoine 2014-11-04 13:47:49

+0

當我在這裏閱讀(http://clang.llvm.org/docs/PCHInternals.html)鏗鏘的pchs通常生成的一攬子標題。 – 4ntoine 2014-11-04 14:08:38