98

プリコンパイル済みヘッダーを GCC で動作させることに成功した人はいますか? 私の試みはうまくいきませんでしたし、セットアップ方法の良い例もあまり見たことがありません。cygwin gcc 3.4.4 を試し、Ubuntu で 4.0 を使用しました。

4

7 に答える 7

61

私は間違いなく成功しています。まず、次のコードを使用しました。


#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 World でした (以下のリンクを参照してください)。まず、-Hgcc でオプションを付けてコンパイルしました。使用したヘッダーの膨大なリストが表示されました。次に、IDE (code::blocks) が生成していたコンパイル フラグを調べたところ、次のようなものが表示されました。

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 ++​​を使用しています

g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3

于 2010-05-29T14:59:42.410 に答える
56

まず、こちらのドキュメントを参照してください

他のファイルと同じようにヘッダーをコンパイルしますが、出力は拡張子が.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 の後で stdafx.h を削除しても、コンパイルは機能します。

于 2009-07-28T00:52:58.353 に答える
9

ソースファイルに対して呼び出すのと同じ方法で gcc を呼び出しますが、ヘッダーファイルを使用します。

例えば

g++ $(CPPFLAGS) test.h

これにより、test.h.gch というファイルが生成されます。

gcc が test.h を検索するたびに、最初に test.h.gch を探し、それが見つかった場合は自動的にそれを使用します。

詳細については、GCC プリコンパイル済みヘッダーを参照してください。

于 2008-09-13T14:49:55.883 に答える
9

-xC++ プリコンパイル済みヘッダーの指定子は であり-x c++-header、 ではありません-x c++。PCH の使用例を以下に示します。

pch.h:

// Put your common include files here: Boost, STL as well as your project's headers.

main.cpp:

#include "pch.h"
// Use the PCH here.

次のように PCH を生成します。

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

を使用pch.h.gchするには と同じディレクトリにある必要があるpch.hため、上記のコマンドは必ず があるディレクトリから実行してくださいpch.h

于 2012-05-25T14:25:31.973 に答える
8

過去に一度、gcc でプリコンパイル済みヘッダーを動作させることができましたが、そのときも問題があったことを思い出します。覚えておくべきことは、特定の条件が満たされない場合、gcc はファイル (header.h.gch など) を無視することです。そのリストは、gcc プリコンパイル済みヘッダー ドキュメント ページにあります。

一般に、最初のステップとしてビルド システムで .gch ファイルをコンパイルし、残りのソースと同じコマンド ライン オプションと実行可能ファイルを使用するのが最も安全です。これにより、ファイルが最新であり、微妙な違いがないことが保証されます。

問題がプロジェクトのソース コードに固有のものである可能性を排除するために、最初に不自然な例で動作させることもおそらく良い考えです。

于 2008-09-12T13:40:00.600 に答える