2010-12-19 6 views
8

gcc(g++として実行中)とGNU makeを使用します。 gccを使用してprecompiled.hというヘッダファイルをプリコンパイルし、precompiled.h.gchを作成します。 Makefileの次の行は、それん:私は別のコマンドラインパラメータでg++を実行しなければならなかったまでGNU makeを使用していくつかのプリコンパイル済みヘッダーファイルを作成する

# MYCCFLAGS is a list of command-line parameters, e.g. -g -O2 -DNDEBUG 
precompiled.h.gch: precompiled.h 
    g++ $(MYCCFLAGS) -c $< -o [email protected] 

すべてがうまくでした。 この場合、precompiled.h.gchが存在しても使用できず、コンパイルがはるかに遅くなります。 gccのドキュメントでは、この状況を処理するためにこれを読んでいます。 precompiled.h.gchというディレクトリを作成し、 というプリコンパイル済みのヘッダーファイルを のコマンドラインパラメータごとに1つずつファイルに追加する必要があります。

ここで、g++に、この方法で を作成するように私のMakefileを変更する必要があるのだろうか。 おそらくg++を実行してprecompiled.h.gchディレクトリの既存のファイル を使用できるかどうかをテストし、 の場合は、固有のファイル名を持つ新しいプリコンパイル済みヘッダーを生成することができます。

gccはこのようなテストをサポートしていますか?

多分私は別の方法で何をしたいのですか?

+0

'-Winvalid-pch'は警告を表示します。 '-Werror'と共に使用すると、gccが無効な.gchを見るとコンパイルを停止します。 – bobbogo

+0

@bobbogoありがとう、これは私が必要とするものです!それは私にいくつかの問題を保存します。 – anatolyg

答えて

5

私自身の質問には奇妙な答えがあります。とにかく、ここに行く。

、適切なプリコンパイル済みヘッダーファイルが存在するかどうかを検出するために、私は私のヘッダファイルへの意図的なエラーを追加:GCCはプリコンパイル済みヘッダーを見つけた場合、それは.hファイルを読むことはありませんので、

// precompiled.h 
#include <iostream> 
#include <vector> 
... 
#error Precompiled header file not found 

これは動作し、エラーに遭遇することはありません。このようなファイルを「コンパイル」を

、私は一時ファイルに結果を配置し、最初のエラーを取り除く:

grep -v '#error' precompiled.h > precompiled.h.h 
g++ -c -x c++ $(MYCCFLAGS) precompiled.h.h -o MORE_HACKERY 

ここMORE_HACKERYは単なるファイル名ではなく、作るためにいくつかのコードが含まれています一意の名前を持つファイル(mktemp)。明確にするため省略した。

0

precompiled.hに#errorを導入するより簡単な方法があります。このファイルを決して作成しないでください。プリコンパイルされたバージョンがある場合(そしてコンパイルフラグが必要な場合)、G ++やVisual C++(少なくとも2005年まで)では、「本当の」ファイルがそこに存在するとは考えていません。

プリコンパイルする#includeのリストを "to_be_precompiled.cpp"としましょう。ファイル名の拡張子はそれほど重要ではありませんが、このファイルを本物のヘッダーファイルとは別の方法で使用する必要があるため、.hファイルと呼ぶのは好きではありません。これが.cppの場合はVisual C++でも簡単です。次に、コード全体を参照するために別の名前を選んで、 "precompiled_stuff"としましょう。ここでも、私はこれを.hファイルと呼んでいません。ファイルではないので、プリコンパイルされたデータを参照する名前です。

他のすべてのソースファイルでは、文#include "precompiled_stuff"は本物のインクルードではなく、プリコンパイルされたデータをロードするだけです。プリコンパイルされたデータを準備するのはあなた次第です。グラム++の場合

  • 、あなたは、その名コンパイラには関係ありません(ただし、ここでは「to_be_precompiled.cpp」になります)ソースファイルから「precompiled_stuff.gch」を作成するために、ビルドルールを必要としています。
  • Visual C++では、文字列 "precompiled_stuff"は/ Yuフラグの値と等しく、読み込まれたプリコンパイルされたデータは無関係な名前の.pchファイルから得られます。これは関連のないソースファイル( "to_be_precompiled" cpp "と表記します)。
  • プリコンパイル済みヘッダーをサポートしていないコンパイラーでビルドする場合のみ、ビルド・ルールは実際のソース・ファイルから離れたビルド・ディレクトリーに、「precompiled_stuff」という実際のファイルを生成する必要があります。 "precompiled_stuff"は、 "to_be_precompiled.cpp"のコピー、ハードリンクまたはシンボリックリンク、または#include "to_be_precompiled.cpp"を含む小さなファイルです。

つまり、すべてのコンパイラでプリコンパイルがサポートされていますが、一部のコンパイラでは単なるダンプコピーです。

+0

Visual Studioでは、C++コンパイラとは異なり、[Intellisenseは(少なくとも2015年に)プリコンパイルされたヘッダーファイルが存在する必要があります](http://stackoverflow.com/questions/31943634/visual-studio-2015-intellisense -errors-but-solution-compiles) – Stein

関連する問題