何です.h.gchファイル?


116

私は最近、G ++でプログラムを作成しなければならないクラスプロジェクトを持っていました。

私はmakefileを使用しましたが、何らかの理由で.h.gchファイルが時々残されました。

時々、これはコンパイルに影響を及ぼさなかったが、しばしば修正された、または意味のない問題に対してコンパイラーがエラーを発行する結果になることがありました。

2つの質問があります。

1).h.gchファイルとは何ですか?そして

2)クリーンアップされていないのになぜこのような問題が発生するのですか?


13
誤って.hファイルをコンパイルするように指示した場合、gccはそれらを作成します。それを行わないでください:)(実際にプリコンパイル済みヘッダーを作成する場合を除きます)
jalf

3
GCCの世界以外では、.gchファイルは.pchと呼ばれます
Patapoom 2017

回答:


115

.gchファイルは、プリコンパイル済みヘッダーです。

a .gchが見つからない場合は、通常のヘッダーファイルが使用されます。

ただし、プロジェクトがプリコンパイル済みヘッダーを生成するように設定されている場合、ヘッダーが存在しない場合は作成され、次のビルドで使用されます。

時には、*.h.gchそのファイルを削除して、もう一度それをコンパイルすると、それを修正する必要がありますので、破損しているか、古い情報が含まれます。


1
では、なぜ.gchのサイズが通常は非常に大きいのですか?
NAND

38

ファイルについて知りたい場合は、ターミナルで入力してください

file filename

file a.h.gch 与える:

GCC precompiled header (version 013) for C

2
鉱山(OSX、zsh)は.h.gchファイルの「データ」とだけ言っています。これには適切なデータベースファイルが必要だと思います。
OndrejSlinták18年



15

他の答えは、gchファイルが何であるかに関して完全に正確です。ただし、コンテキスト(この場合、g ++を使用する初心者)がすべてです。このコンテキストでは、2つのルールがあります。

  1. 決して、決して、.hファイルをg ++コンパイル行に配置しないでください。.cppファイルのみ。.hファイルが誤ってコンパイルされた場合は、*。gchファイルをすべて削除してください。

  2. 決して、決して、.cppファイルを#includeステートメントに配置しないでください。

ルール1に違反した場合、ある時点で質問に記載されている問題が発生します。ルール2が破られた場合、リンカはある時点で、多重定義されたシンボルについて文句を言うでしょう。


2
最初のポイントでは、例として関数を使用します。プログラマーがmyfunc()を呼び出す前に、プログラマーは関数プロトタイプを使用してコンパイラーにmyfunc()を記述する必要があります。複数の異なる.cppファイルがmyfunc()を呼び出す場合、プロトタイプを各.cppに提供する必要があります。各.cppファイルにプロトタイプを入力するとエラーが発生しやすくなります。したがって、関数プロトタイプは、myfuncが呼び出される各.cppファイルに#includeされている.hファイルに配置されます。ヘッダーファイルには、コンパイラの情報のみが含まれ、実行されるコードは含まれません。したがって、.hファイルをg ++行に配置しても意味がありません。
tgibson 2016年

ルール2では、テンプレート関数の定義がある場合は.cppファイルを#includeします
NAND
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.