簡體   English   中英

有效地共享預編譯的標題

[英]Sharing Pre-compiled Headers efficiently

我有一個框架,正在被幾個項目使用(其中包括幾個示例以顯示框架是如何工作的)。 該框架具有核心,圖形,物理,gui等組件。每個組件都是一個單獨的庫。 有幾種配置。

主解決方案文件使用所有可能的配置編譯整個項目,以便項目可以使用庫。 由於框架很少被重新編譯,特別是由某人(包括我)處理使用該框架的項目,因此預編譯許多標頭是有意義的。

最初我讓每個項目/樣本都有自己的預編譯頭,用於整個項目。 每次我必須重建相同的pch(例如,Debug),所以我決定共享PCH將減少冗余PCH編譯。 到現在為止還挺好。 我有一個項目,編譯PCH和庫。 所有后續項目/樣本現在都使用相同的PCH。 這非常有效。

唯一的問題是我看到文件大小增加了。 這不是障礙,就好像要發布使用該框架的項目一樣,它可以將自己從共享的PCH中切斷並自行創建。 為了快速開發,我已經這樣做了(我實際上已經創建了一個工具,可以為新項目/樣本創建VS項目文件和源文件,以便於構建以及升級以前使用舊版本的項目框架的版本)。

無論如何,(我假設)文件大小的增加是因為創建共享PCH的獨立VS項目文件包括來自所有庫的所有頭文件。 我的問題是我是否可以使用條件編譯(#ifndef)來減少最終可執行文件的大小? 或者也許以某種方式共享多個PCH文件(據我所知,這是不可能的,但我可能錯了)如果我沒有意義,請說出來(實際上是:))因為我對PCH文件的了解非常有限。

謝謝!

注意:為了重新迭代並清楚地說明,到目前為止,我有一個解決方案文件正在編譯包括共享PCH在內的所有庫。 現在,如果我重新編譯所有示例和項目,它們最多可以在幾秒或更長時間內編譯。 之前,每個項目都會重新創建一個PCH文件。 另外,最初我想為每個庫提供PCH,但后來我發現源文件不能使用多個PCH文件,所以這個選項不可行。 另一個選擇是編譯PCH文件的所有可能組合,但這太耗時,麻煩且容易出錯。

聽起來大小問題來自使用你實際上並不需要的標題,但是由於轉換速度更快,在開發時使用這些標題仍然有意義。

使用#ifndefs時:預編譯很粗糙。 您無法在存在差異的位置共享預編譯工作。 如果使用#ifndefs來制作你所包含內容的不同變體,即使你有

#ifndef FOO

然后,預編譯頭必須在使用該預編譯頭的兩個文件中以不同方式定義FOO的點之前停止。 所以#ifndef不會解決問題。 最終結果是FOO必須相同,或者您要回到不同項目的單獨pch文件。 都不能解決問題。

至於共享多個.pch文件:.pch文件的一個基本限制是每個.obj只能使用一個。 當然.pch文件可以有任意組合的標題。 你可以擁有一個核心+圖形的.pch,一個核心+物理的核心,核心+ ai等。如果沒有一個源文件需要與一個核心+一個模塊進行“交談”,這樣就可以了。時間。 這對我來說聽起來不太現實。 這樣的計划和變體聽起來像很多重組工作,沒有真正的收獲。 您不希望構建數以萬計的組合並跟蹤它們。 這是可能的,但它不會節省你的時間。

在我看來,你通過犧牲可執行文件大小來實現正確的事情,以便在開發/調試期間快速周轉,然后以更慢但更精簡的方式構建實際版本。

在過去,我發現當你在預編譯的頭文件中放入更多內容時,很快就會遇到收益遞減的問題,所以如果你想在更多的項目中投入更多資源,那么它將會更多指出它放慢了速度。 在我們的項目中,PCH文件比大多數源文件需要更長的時間來編譯,但仍然只有幾秒鍾。 我建議制作特定於您正在使用的每個項目的PCH文件。 你是對的說源文件只能引用一個PCH文件,但解決這個問題的一種方法是使用'force include'選項(我認為在Advanced選項卡中)以確保所有文件都包含PCH該項目的文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM