2010-03-27 42 views
4

短篇小說:gcc預編譯頭奇怪的行爲與-c選項

我不能使預編譯頭與gcc -c選項正常工作。

長的故事:

夥計們,我使用Linux和一個真正的大項目,我決定測試他們對簡單的程序試圖預編譯的頭前,GCC-4.4.1。他們「有點工作」,但我對結果不滿意,我確定我的設置有問題。

首先,我寫了一個簡單的程序(main.cpp中)來測試,如果他們在所有的工作:

#include <boost/bind.hpp> 
#include <boost/function.hpp> 
#include <boost/type_traits.hpp> 

int main() 
{ 
    return 0; 
} 

然後,我創建的預編譯頭文件pre.h(在同一目錄)如下:

#include <boost/bind.hpp> 
#include <boost/function.hpp> 
#include <boost/type_traits.hpp> 

...並編譯它:

$ g++ -I. pre.h 

(pre.h.gch創建)

之後,我測量有和沒有預編譯頭編譯時間:

與PCH

$ time g++ -I. -include pre.h main.cpp 

real 0m0.128s 
user 0m0.088s 
sys 0m0.048s 

沒有PCH

$ time g++ -I. main.cpp 

real 0m0.838s 
user 0m0.784s 
sys 0m0.056s 

到目前爲止好! 快7倍,令人印象深刻!現在讓我們嘗試一些更現實的東西。我的所有資源都是用-c選項構建的,出於某種原因,我無法使pch與其搭配。你可以用下面的下面的步驟重現此...

我創建的測試模塊Foo.cpp中如下:

#include <boost/bind.hpp> 
#include <boost/function.hpp> 
#include <boost/type_traits.hpp> 

int whatever() 
{ 
    return 0; 
} 

這裏是我的嘗試與構建模塊Foo.cpp中和的時機無PCH:

與PCH

$ time g++ -I. -include pre.h -c foo.cpp 

real 0m0.357s 
user 0m0.348s 
sys 0m0.012s 

沒有PCH

$ time g++ -I. -c foo.cpp 

real 0m0.330s 
user 0m0.292s 
sys 0m0.044s 

這很奇怪,看起來好像沒有加速!(我跑了好幾次)。事實證明,在這種情況下,根本沒有使用預編譯頭文件,我用-H選項(輸出「g ++ -I。-include pre.h -c foo.cpp -H」沒有列出pre.h文件。 gch)。

我在做什麼錯?

回答

8

好吧,我想我已經找到了解決辦法:-fpch-預處理應該與同-c選項一起使用。它像一個魅力!

這裏的時序:

與PCH

$ time g++ -I. -include pre.h -c foo.cpp -fpch-preprocess 

real 0m0.028s 
user 0m0.016s 
sys 0m0.016s 

沒有PCH

$ time g++ -I. -c foo.cpp 

real 0m0.330s 
user 0m0.292s 
sys 0m0.044s 

更新:我問同樣的問題gcc的幫助,郵件列表和伊恩蘭斯泰勒解釋了這種奇怪的行爲ior通過使用distcc/ccache。這些工具首先對源進行預處理,這就是爲什麼需要這個選項。