誰もがGCCで動作するプリコンパイル済みヘッダーの取得に成功しましたか?私は私の試みで運がなかったし、それを設定する方法の多くの良い例を見たことがありません。私はcygwin gcc 3.4.4を試し、Ubuntuで4.0を使用しました。
誰もがGCCで動作するプリコンパイル済みヘッダーの取得に成功しましたか?私は私の試みで運がなかったし、それを設定する方法の多くの良い例を見たことがありません。私はcygwin gcc 3.4.4を試し、Ubuntuで4.0を使用しました。
回答:
私は間違いなく成功しました。まず、次のコードを使用しました。
#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 ++-壁-例外-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
-Winvalid-pch
プリコンパイル済みヘッダーが適切に使用されていることを確認するために使用してみましたか?デバッグビルドにpchを使用することで大きな改善が見られたので、セットアップに問題があるのではないかと思います。
ヘッダーは他のファイルと同じようにコンパイルしますが、出力をファイルのサフィックスが付いたファイル内に配置します.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を削除しても、コンパイルは機能します。
-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
。
-c pch.h
であるべき-c pch.cpp
ですか?
過去に一度、gccでプリコンパイル済みヘッダーを機能させることができましたが、そのときに問題があったことも思い出します。覚えておくべきことは、特定の条件が満たされない場合、gccはファイル(header.h.gchまたは同様のもの)を無視するということです。そのリストは、gccプリコンパイル済みヘッダードキュメントページにあります。
一般に、ビルドシステムで最初のステップとして.gchファイルをコンパイルするのが最も安全です。他のソースと同じコマンドラインオプションと実行可能ファイルを使用します。これにより、ファイルが最新であり、微妙な違いがないことが保証されます。
問題がプロジェクトのソースコードに固有である可能性を排除するために、最初に人為的な例を使用して動作させることもおそらく良い考えです。
ソースファイルに対して呼び出すのと同じ方法でgccを呼び出しますが、ヘッダーファイルを使用します。
例えば
g++ $(CPPFLAGS) test.h
これにより、test.h.gchというファイルが生成されます
gccはtest.hを検索するたびに、最初にtest.h.gchを探し、見つかった場合は自動的に使用します。
詳細については、GCCプリコンパイル済みヘッダーをご覧ください。
必ず -include your_header.h
これは私がプリコンパイルして使用した方法です bits/stdc++.h
コレクションです。
コード
#include <bits/stdc++.h>
次に、-Hを使用してファイルをコンパイルし、出力を確認して、libを見つけました
g++ sol.cpp -H -O3 -pthread -lm -std=c++14 -o executable
私が見たところ
. /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h
そこでbits
、現在のディレクトリ内に新しいディレクトリを作成しstdc++.h
、そこからコピーしました。
それから私は走った
g++ bits/stdc++.h -O3 -std=c++14 -pthread
生成された bits/stdc++.gch
通常、私はコードをコンパイルしました
g++ sol.cpp -O3 -pthread -lm -std=c++14 -o executable
、しかし私はそれを
g++ sol.cpp -include bits/stdc++.h -O3 -pthread -lm -std=c++14 -o executable
それは.gch
ファイルの代わりにファイルに解決されるだけだったので.h
、-include bits/stdc++.h
それは私にとって重要でした。覚えておくべき他のことはあなたがあなたのをコンパイルするの*.h
とほとんど同じパラメータでヘッダファイルをコンパイルしなければならないということです*.cpp
。含めなかった場合、-O3
またはプリコンパイル済みヘッダーが-pthread
無視された*.gch
場合。
すべてが正しいかどうかを確認するには、結果を比較して時間差を測定できます
time g++ sol.cpp ...
または実行
g++ sol.cpp -H -O3 -pthread -lm -std=c++14 -o executable
もう一度、ヘッダーパスを探します。!
たとえば、ライブラリパスの前にいる場合は、たとえば
! ./bits/stdc++.h.gch
....