2012-06-09 51 views
6

運行:gcc版本4.2.1(蘋果公司建立5664)慢編譯時間與升壓+ GCC +編譯頭

我創建了一個默認的預編譯的頭一個蘋果XCode項目。它看起來非常慢,並且一個主要功能no的簡單主文件包括無需編碼需要6秒的編譯,這是我升級到新的SSD驅動器後。我在筆記本電腦上,但我保留升級到工作站將緩解我的問題。如果我關閉預編譯頭文件,那麼主文件將在一秒之內編譯。看起來使用預編譯頭文件會對所有文件造成損失。這種延遲使我想避免編譯和嘗試不好的代碼。這是我包括在我的預編譯頭文件中:

#pragma once 

#include <algorithm> 
#include <bitset> 
#include <complex> 
#include <deque> 
#include <fstream> 
#include <functional> 
#include <iostream> 
#include <istream> 
#include <iterator> 
#include <limits> 
#include <list> 
#include <locale> 
#include <map> 
#include <numeric> 
#include <ostream> 
#include <queue> 
#include <set> 
#include <sstream> 
#include <stack> 
#include <stdexcept> 
#include <streambuf> 
#include <string> 
#include <valarray> 
#include <vector> 

#include <boost/smart_ptr/scoped_ptr.hpp> 
#include <boost/smart_ptr/scoped_array.hpp> 
#include <boost/smart_ptr/shared_ptr.hpp> 
#include <boost/smart_ptr/shared_array.hpp> 
#include <boost/smart_ptr/make_shared.hpp> 
#include <boost/smart_ptr/weak_ptr.hpp> 
#include <boost/smart_ptr/intrusive_ptr.hpp> 

#include <boost/regex.hpp> 
#include <boost/thread.hpp> 
#include <boost/bind/bind.hpp> 
#include <boost/bind/apply.hpp> 
#include <boost/bind/protect.hpp> 
#include <boost/bind/make_adaptable.hpp> 

#include <boost/asio.hpp> 
//#include <boost/asio/ssl.hpp> 


#include <boost/property_tree/ptree.hpp> 
#include <boost/random.hpp> 
#include <boost/lexical_cast.hpp> 
#include <boost/date_time/gregorian/gregorian.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 
#include <boost/date_time/local_time/local_time.hpp> 
#include <boost/date_time/time_zone_base.hpp> 
#include <boost/circular_buffer.hpp> 
#include <boost/accumulators/accumulators.hpp> 
#include <boost/accumulators/statistics.hpp> 

我沒有包含精神,這確實會使編譯時間上升。

+0

因此,一個「主函數不重複的簡單主文件不包含代碼」比編譯上述所有包含的項目花費的時間要少很多?這應該不是預期的嗎? – jedwards

+0

另外,我對預編譯頭文件的理解是,它們只是傾向於節省編譯時間,否則它們會通過來自多個源的「include」重複編譯。這不是你的情況,所以我想象你使用預編譯頭文件的編譯時間會類似於沒有。也就是說,通過使用預編譯頭文件你不會意識到很大的收穫。你真的應該限制你的包含在源文件特定的基礎上你需要什麼。 – jedwards

+0

這是什麼意思:「這個延遲使我想避免編譯和試驗不好的代碼。」? – jedwards

回答

7

GCC的預編譯頭文件以非常特殊的方式工作。只有一個預編譯頭文件可用於任何給定的源文件。使用-H來顯示給定的頭文件是否使用預編譯版本。

此外,您必須使用與使用它的源文件完全相同的編譯器標誌來編譯頭文件。

建立一個PCH環境的典型方法是這樣的:

main.cpp中:

#include "allheaders.hpp" 

int main() { /* ... */ } 

allheaders.hpp:

#include <algorithm> 
// ... everything you need 

編譯:

g++ $CXXFLAGS allheaders.hpp     # 1 
g++ $CXXFLAGS -H -c -o main.o main.cpp  # 2 
g++ $LDFLAGS -o myprogram main.o    # 3 

步驟#1後,你應該最終得到一個文件allheaders.hpp.gch,這應該是相當大的。在步驟#2中-H標誌應該產生額外的輸出,告訴你正在使用預編譯頭文件。步驟#3鏈接可執行文件。

這個想法是,步驟#1可能需要很長時間,但步驟#2應該快得多。

+1

我已經分析了GCC命令,它引用了一個308 MB僞文本文件,該文件似乎是一個處理過的預編譯頭文件。預編譯的頭文件被自動包含在每個源文件中,有些人似乎沒有得到,並且引入了大約6秒的延遲。我不記得有VS的視覺工作室的問題,但VS我總是在一個更強大的工作站上運行它。當我在一個文件中更改一個字母時,6秒的延遲時間是不可接受的,並且在開發週期中增加了分鐘/小時/天的浪費時間。 – user805547

+0

那麼,你應該對哪些頭文件進行預編譯。當然,你不應該有一個單一的普遍適用的PCH。理想情況下,您需要爲每個*源文件單獨製作一個單獨的「全部標題」標題。實際上,我會爲那些實際上實現所有重Boost的文件保留這種處理方式。 –

+0

我幾乎在任何地方都使用boost,所以不把它們放在PCH中會導致單個文件慢慢編譯。我開始認爲這款筆記本電腦和軟件對於嚴肅的C++開發來說太慢了。對可可來說很好,但Boost和模板和元編程的大量使用是一個殺手。 – user805547