プリコンパイル済みヘッダーを GCC で動作させることに成功した人はいますか? 私の試みはうまくいきませんでしたし、セットアップ方法の良い例もあまり見たことがありません。cygwin gcc 3.4.4 を試し、Ubuntu で 4.0 を使用しました。
7 に答える
私は間違いなく成功しています。まず、次のコードを使用しました。
#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 でした (以下のリンクを参照してください)。まず、-H
gcc でオプションを付けてコンパイルしました。使用したヘッダーの膨大なリストが表示されました。次に、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
他のファイルと同じようにヘッダーをコンパイルしますが、出力は拡張子が.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 を削除しても、コンパイルは機能します。
ソースファイルに対して呼び出すのと同じ方法で gcc を呼び出しますが、ヘッダーファイルを使用します。
例えば
g++ $(CPPFLAGS) test.h
これにより、test.h.gch というファイルが生成されます。
gcc が test.h を検索するたびに、最初に test.h.gch を探し、それが見つかった場合は自動的にそれを使用します。
詳細については、GCC プリコンパイル済みヘッダーを参照してください。
-x
C++ プリコンパイル済みヘッダーの指定子は であり-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
。
過去に一度、gcc でプリコンパイル済みヘッダーを動作させることができましたが、そのときも問題があったことを思い出します。覚えておくべきことは、特定の条件が満たされない場合、gcc はファイル (header.h.gch など) を無視することです。そのリストは、gcc プリコンパイル済みヘッダー ドキュメント ページにあります。
一般に、最初のステップとしてビルド システムで .gch ファイルをコンパイルし、残りのソースと同じコマンド ライン オプションと実行可能ファイルを使用するのが最も安全です。これにより、ファイルが最新であり、微妙な違いがないことが保証されます。
問題がプロジェクトのソース コードに固有のものである可能性を排除するために、最初に不自然な例で動作させることもおそらく良い考えです。