Visual Studioのプロジェクト間でプリコンパイル済みヘッダーを共有する
-
22-07-2019 - |
質問
すべてPCHを使用する多くのVisual C ++プロジェクトを使用したソリューションがありますが、プロジェクト固有のニーズのために特定のコンパイラスイッチがオンになっているものもあります。
これらのプロジェクトのほとんどは、それぞれのstdafx.h(STL、ブーストなど)で同じヘッダーセットを共有しています。プロジェクト間でPCHを共有することが可能かどうか疑問に思っているので、プロジェクトごとにすべてのPCHをコンパイルする代わりに、ソリューション内のほとんどのプロジェクトで使用できる共通のPCHを1つ持つことができます。
PCHの場所をプロジェクト設定で共有場所として指定することは可能だと思われるので、これでうまくいくと思います。また、共有PCHを使用するすべてのプロジェクトのすべてのソースファイルは同じコンパイラー設定を持つ必要があります。そうしないと、コンパイラーはPCHとコンパイル中のソースファイルの不一致について文句を言うでしょう。
誰かがこれを試しましたか?動作しますか?
関連する質問:そのようなシャードPCHは過度に包括的である必要がありますか、それとも全体のビルド時間を損ないますか?たとえば、共有PCHには、広く使用されている多くのSTLヘッダーを含めることができますが、一部のプロジェクトでは<string>
および<vector>
のみが必要な場合があります。共有PCHを使用して節約された時間は、ビルドプロセスの後半で、オプティマイザーがPCHによってプロジェクトにドラッグされたすべての未使用のものを破棄しなければならないときに返済する必要がありますか?
解決
はい、それは可能であり、私はあなたを保証することができます、時間の節約は重要です。 PCHをコンパイルするとき、PCHファイルを作成しているプロジェクトから.pdb
および.idb
ファイルをコピーする必要があります。私の場合、PCHファイルを作成する単純な2つのファイルプロジェクトがあります。ヘッダーはPCHヘッダーになり、ソースはプロジェクト設定でPCHを作成するように指示されます。これは、プロジェクトで通常行う操作に似ています。前述のように、構成ごとに同じコンパイル設定を行う必要があります。そうしないと、矛盾が発生し、コンパイラーが文句を言います。
再構築が行われるたびに、またはPCHが再コンパイルされるたびに、上記のファイルをコピーするのは面倒なので、自動化します。コピーを自動化するには、上記のファイルが適切なディレクトリにコピーされるビルド前イベントを実行します。たとえば、PCHのDebug
およびRelease
ビルドをコンパイルする場合、PCHプロジェクトの/-Y
から依存プロジェクトの<=>にファイルをコピーします。したがって、コピーコマンドは次のようになります
copy PchPath \ Debug * .pdb Debug \ / -Y
最後の<=>に注意してください。最初のビルドの後、後続の各ビルドはインクリメンタルにコンパイルされるため、ファイルを再度置き換えると、Visual Studioは破損したシンボルについて文句を言います。それらが破損した場合、いつでもファイルをコピーする再構築をいつでも実行できます(今回は、それらが存在しなくなったためそれらをスキップしません-クリーンアップはファイルを削除します)。
これが役立つことを願っています。これを行うにはかなり時間がかかりましたが、それだけの価値がありました。 1つの大きなフレームワークに依存するプロジェクトがいくつかあり、PCHをコンパイルする必要があるのは1回だけです。すべての依存プロジェクトが非常に迅速にコンパイルされるようになりました。
編集:他の複数の人々と一緒に、VS2010でこれをテストしました VS2012が正常に動作しているようです。
他のヒント
これは古い質問ですが、Visual Studio 2017で機能し、コピーを必要としない新しい回答を提供したいと思います。唯一の欠点:編集と続行はもう機能しません。
基本的に、プリコンパイル済みヘッダー用の新しいプロジェクトを作成し、他のすべてのプロジェクトに依存させる必要があります。これが私がしたことです:
ステップバイステップ:
-
ヘッダー(ここからpch.hと呼びます)とpch.hを含む1行のcppファイルを含むソリューション内で新しいプロジェクトを作成します。プロジェクトは静的ライブラリを作成する必要があります。新しいプロジェクトをセットアップして、プリコンパイル済みヘッダーを作成します。出力ファイルは、すべてのプロジェクトからアクセス可能である必要があります。私にとっては、これはIntDirに関連していますが、デフォルト設定では$(SolutionDir)に関連している可能性があります。 pchプロジェクトは、他のすべてのプロジェクトも定義している必要があります。
-
他のすべてのプロジェクトがこの新しいプロジェクトに依存するようにします。そうしないと、ビルドの順序が間違っている可能性があります。
-
他のすべてのプロジェクトをセットアップして、pch.hを使用します。出力ファイルのパラメーターがpchプロジェクトと同じである方法を参照してください。追加のインクルードディレクトリもpch.hディレクトリを指す必要があります。オプションで、すべてのcppにpchファイルを強制的に含めることができます(またはすべてのcppファイルの最初の行に手動で含めます)。
私は何も忘れないことを望みます。私のソリューション(130k loc、160プロジェクト)の場合、コンパイル時間は約3:30分ではなく、約2:30分になります。
PCHがコンパイルされたのと同じPDBに対して各ソースファイルをコンパイルする必要があるため、不可能であるようです。くそー。
Samaursaの答えは私のために働いた。
これも見ました動作するリンク(下部近くにあるReginaldの答えを探してください。)
これはcopy
を使用しますが、Reginaldはxcopy
を使用します(<=>が望ましい)。いずれにせよ、感謝-これは私のビルドをかなりスピードアップしました。
これは、<!> quot;逓減収益<!> quot;のように聞こえます。私に。共通ヘッダーを含めると、.cppファイルごとに1秒が無駄になり、各ターゲット(DLL / EXE)には10個の.cppファイルがあると仮定します。ターゲットごとに.pchを使用すると、ターゲットごとに10秒節約できます。プロジェクト全体に10個のターゲットがある場合、ビルド全体で1.5分節約できます。これは良いことです。
ただし、プロジェクト全体で1つの.pchに減らすと、さらに9秒しか節約できません。その価値はありますか?余分な労力(VSウィザードではサポートされていない非標準の構成であるため、設定がはるかに面倒になる場合があります)は、10分の1の節約になります。