42

多くのVisualC++プロジェクトを使用したソリューションがあり、すべてPCHを使用していますが、プロジェクト固有のニーズに合わせて特定のコンパイラスイッチをオンにしているものもあります。

これらのプロジェクトのほとんどは、それぞれのstdafx.h(STL、ブーストなど)で同じヘッダーのセットを共有します。プロジェクト間でPCHを共有できるかどうか疑問に思っています。そうすれば、プロジェクトごとにすべてのPCHをコンパイルする代わりに、ソリューション内のほとんどのプロジェクトで使用できる共通のPCHを1つ持つことができます。

PCHの場所をプロジェクト設定で共有場所として指定することは可能であると思われるので、これでうまくいくと思います。また、共有PCHを使用するすべてのプロジェクトのすべてのソースファイルが同じコンパイラ設定である必要があると想定しています。そうでない場合、コンパイラはPCHとコンパイルされるソースファイルの間の不整合について文句を言います。

誰かがこれを試しましたか?それは機能しますか?

関連する質問:そのようなシャードPCHは過度に包括的である必要がありますか、それとも全体的なビルド時間を損なうでしょうか?たとえば、共有PCHには、広く使用されている多くのSTLヘッダーを含めることができますが、一部のプロジェクトでは、とだけが必要な場合が<string>あり<vector>ます。共有PCHを使用することで節約された時間は、ビルドプロセスの後の時点で、オプティマイザーがPCHによってプロジェクトにドラッグされた未使用のものをすべて破棄する必要があるときに返済する必要がありますか?

4

6 に答える 6

25

はい、それは可能です。時間を大幅に節約できます。PCH をコンパイルするときは、PCH ファイルを作成しているプロジェクトから.pdbおよび.idbファイルをコピーする必要があります。私の場合、PCH ファイルを作成する単純な 2 つのファイル プロジェクトがあります。ヘッダーは PCH ヘッダーになり、ソースはプロジェクト設定で PCH を作成するように指示されます。これは、どのプロジェクトでも通常行うことと似ています。おっしゃったように、構成ごとに同じコンパイル設定を使用する必要があります。そうしないと、不一致が発生し、コンパイラが文句を言います。

再構築のたびに、または PCH を再コンパイルするたびに上記のファイルをコピーするのは面倒なので、自動化します。コピーを自動化するには、ビルド前のイベントを実行して、上記のファイルを適切なディレクトリにコピーします。たとえば、PCH をコンパイルDebugおよびReleaseビルドする場合は、ファイルをDebugPCH プロジェクトから依存プロジェクトのにコピーしますDebug。したがって、コピー コマンドは次のようになります。

copy PchPath\Debug*.pdb Debug\ /-Y

/-Y末尾に注意してください。最初のビルドの後、後続の各ビルドはインクリメンタル コンパイルされるため、ファイルを再度置き換えると、Visual Studio はシンボルの破損についてエラーを出します。ファイルが破損した場合は、いつでも再構築を実行できます。これにより、ファイルが再度コピーされます (今回はファイルが存在しないため、スキップされません。クリーンアップによってファイルが削除されます)。

これが役立つことを願っています。これができるようになるまでにはかなりの時間がかかりましたが、それだけの価値がありました。1 つの大きなフレームワークに依存する複数のプロジェクトがあり、PCH をコンパイルする必要があるのは 1 回だけです。すべての依存プロジェクトが非常に迅速にコンパイルされるようになりました。

編集: 他の何人かと一緒に、VS2010 と VS2012 でこれをテストしましたが、正しく動作しているようです。

于 2010-11-13T04:05:40.787 に答える
5

サマウルサの答えは私にとってはうまくいきました。

また、このリンクが機能することも確認しました (下部にある Reginald の回答を探してください)。

これはcopy、レジナルドが使用しているときに使用しますxcopy(私が好むxcopy)。いずれにせよ、おかげで、ビルドが大幅に高速化されました。

于 2010-12-16T18:02:48.777 に答える
5

PCH がコンパイルされたのと同じ PDB に対して各ソース ファイルをコンパイルする必要があるため、それは不可能のようです。くそー。

于 2009-03-18T19:14:22.117 に答える
3

これは、私にとって「収穫逓減」の場合のように聞こえます。共通ヘッダーを含めると、.cppファイルごとに1秒が直接無駄になり、各ターゲット(DLL / EXE)に10個の.cppファイルがあるとします。ターゲットごとに.pchを使用すると、ターゲットごとに10秒節約できます。プロジェクト全体に10個のターゲットがある場合、ビルド全体で1.5分節約できます。これは良いことです。

しかし、プロジェクト全体で1 .pchに減らすことで、さらに9秒しか節約できません。その価値はありますか?余分な労力(VSウィザードでサポートされていない非標準の構成であるため、セットアップがはるかに面倒な場合があります)は、10分の1の節約になります。

于 2009-03-14T10:52:21.307 に答える