2008-09-12 163 views
85

任何人都可以獲得使用GCC的預編譯頭文件嗎?我的嘗試中沒有運氣,我還沒有看到很多好的例子來說明如何設置它。我嘗試過使用cygwin gcc 3.4.4並在Ubuntu上使用4.0。使用GCC預編譯頭文件

+0

我試過了,我有預編譯頭文件的最佳用例,因爲我的c源代碼是編譯器生成的而不是用戶編寫的。 Sun Studio,特別是Visual Studio改善了構建時間。在gcc上它變得更糟,沒有預編譯頭文件。這是3.4與4.x沒有testet,但速度和gcc是互斥的。 – Lothar 2009-11-04 12:33:02

+0

@Lothar代碼是什麼?我發現g ++的速度比最近的Visual Studio編譯器快10倍,在一些模板化的代碼上。 – 2014-10-08 15:30:54

+0

我沒有在我的C++代碼中使用模板。這只是C +異常處理+漂亮的C++擴展。即使在這個問題出現6年之後,VS2010的速度也要快一些。但在此期間,我有16個核心,所以我可以忍受它。 – Lothar 2014-11-09 05:24:25

回答

6

我已經設法在gcc下使用過預編譯頭文件,並且我記得還有問題。需要記住的是,如果不符合某些條件,gcc將忽略該文件(header.h.gch或類似文件),其列表可在gcc precompiled header documentation page上找到。

通常,將構建系統作爲第一步編譯.gch文件是最安全的,它具有與其他源代碼相同的命令行選項和可執行文件。這確保文件是最新的,並且沒有細微差別。

它可能是一個好主意,首先讓它與一個人爲的例子一起工作,只是爲了消除您的問題是特定於項目中源代碼的可能性。

4

調用gcc的方式與您爲源文件調用它的方式相同,但是使用頭文件。

例如

g++ $(CPPFLAGS) test.h 

這會產生一個呼籲test.h它首先尋找test.h.gch test.h.gch

每次GCC搜索文件,如果找到它,它會自動使用它。

更多信息可以GCC Precompiled Headers

+0

我使用gcc 3.4,g ++ stdafx.h不會編譯,你會得到錯誤「g ++:彙編頭文件請求」,但是這樣會編譯,不知道是不是我想要的:「g ++ -c - x C++ stdafx.h -o stdafx.h.pch「 – stefanB 2009-05-15 01:56:46

46

Firstly, see the documentation here下找到。

您可以像編譯任何其他文件一樣編譯頭文件,但是會將輸出內容放在後綴爲.gch的文件中。

因此,舉例來說,如果你預編譯stdafx.h中,你將有機會自動搜索名爲stdafx.h.gch隨時隨地預編譯的頭,你包括stdafx.h

例子:

stdafx.h中:

#include <string> 
#include <stdio.h> 

a.cpp:

#include "stdafx.h" 
int main(int argc, char**argv) 
{ 
    std::string s = "Hi"; 
    return 0; 
} 

然後編譯如下:

> g++ -c stdafx.h -o stdafx.h.gch
> g++ a.cpp
> ./a.out

如果步驟1

+1

感謝您給出一個工作示例! – nobar 2010-01-18 06:44:46

51

我都肯定有成功後刪除stdafx.h中你的編譯甚至會工作。首先,我使用下面的代碼:


#include <boost/xpressive/xpressive.hpp> 
#include <iostream> 

using namespace std; 
using namespace boost::xpressive; 

//A simple regex test 
int main() 
{ 
    std::string hello("hello world!"); 

    sregex rex = sregex::compile("(\\w+) (\\w+)!"); 
    smatch what; 

    if(regex_match(hello, what, rex)) 
    { 
     std::cout << what[0] << '\n'; // whole match 
     std::cout << what[1] << '\n'; // first capture 
     std::cout << what[2] << '\n'; // second capture 
    } 
    return 0; 
} 

這只是一個來自Boost Xpressive的hello世界(參見下面的鏈接)。首先,我編譯了gcc中的-H選項。它顯示了它使用的標題的巨大列表。然後,我看了一下編譯標誌我的IDE(代碼::塊)的生產和看到的東西是這樣的:

g++ -Wall -fexceptions -g -c main.cpp -o obj/Debug/main.o

所以我寫了一個命令編譯Xpressive.hpp有確切的文件相同的標誌:

sudo g++ -Wall -fexceptions -g /usr/local/include/boost/xpressive/xpressive.hpp

我與-H再次編譯原碼,並得到此輸出:

 
g++ -Wall -fexceptions -H -g  -c main.cpp -o obj/Debug/main.o 
! /usr/local/include/boost/xpressive/xpressive.hpp.gch 
main.cpp 
. /usr/include/c++/4.4/iostream 
.. /usr/include/c++/4.4/x86_64-linux-gnu/bits/c++config.h 
.. /usr/include/c++/4.4/ostream 
.. /usr/include/c++/4.4/istream 
main.cpp 

這個!意味着編譯器能夠使用預編譯的頭文件。 x意味着它無法使用它。使用適當的編譯器標誌至關重要。我摘下了-H並進行了一些速度測試。預編譯頭文件從14秒改進爲11秒。不壞但不是很好。

注意:以下是示例的鏈接:http://www.boost.org/doc/libs/1_43_0/doc/html/xpressive/user_s_guide.html#boost_xpressive.user_s_guide.examples我無法在帖子中找到它。

順便說一句:我使用下面克++

g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3

6

爲了生成PCH而不是使用-x c++使用-x c++-header

pch.h:

<put your common include files here> 

pch.cpp:

#include "pch.h" 

生成PCH:

g++ -x c++-header -o pch.h.gch -c pch.cpp 

的pch.h.gch必須在相同的目錄中pch.h!