簡體   English   中英

gcc預編譯頭文件使用-c選項時的奇怪行為

[英]gcc precompiled headers weird behaviour with -c option

短篇故事:

我無法使用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;
}

以下是我嘗試使用和不使用pch構建模塊foo.cpp的時間:

與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 at all)。

我究竟做錯了什么?

好吧,我想我找到了解決方案: -fpch-preprocess應該與-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幫助郵件列表上問了同樣的問題,Ian Lance Taylor通過使用distcc / ccache解釋了這個奇怪的行為。 這些工具首先預處理源,這就是需要這些選項的原因。

暫無
暫無

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

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