Visual Studioのプロジェクト間でプリコンパイル済みヘッダーを共有する

StackOverflow https://stackoverflow.com/questions/645747

質問

すべて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で機能し、コピーを必要としない新しい回答を提供したいと思います。唯一の欠点:編集と続行はもう機能しません。

基本的に、プリコンパイル済みヘッダー用の新しいプロジェクトを作成し、他のすべてのプロジェクトに依存させる必要があります。これが私がしたことです:

ステップバイステップ:

  1. ヘッダー(ここからpch.hと呼びます)とpch.hを含む1行のcppファイルを含むソリューション内で新しいプロジェクトを作成します。プロジェクトは静的ライブラリを作成する必要があります。新しいプロジェクトをセットアップして、プリコンパイル済みヘッダーを作成します。出力ファイルは、すべてのプロジェクトからアクセス可能である必要があります。私にとっては、これはIntDirに関連していますが、デフォルト設定では$(SolutionDir)に関連している可能性があります。 pchプロジェクトは、他のすべてのプロジェクトも定義している必要があります。

     pchプロジェクト設定

  2. 他のすべてのプロジェクトがこの新しいプロジェクトに依存するようにします。そうしないと、ビルドの順序が間違っている可能性があります。

    プロジェクト参照

  3. 他のすべてのプロジェクトをセットアップして、pch.hを使用します。出力ファイルのパラメーターがpchプロジェクトと同じである方法を参照してください。追加のインクルードディレクトリもpch.hディレクトリを指す必要があります。オプションで、すべてのcppにpchファイルを強制的に含めることができます(またはすべてのcppファイルの最初の行に手動で含めます)。

     pch 「含める」 「含める」

    1. すべてのプロジェクト(pchプロジェクトを含む)をセットアップして、同じコンパイラシンボルファイルを使用します(リンカシンボルファイルは影響を受けません)。繰り返しますが、私の例ではこれはOutDirですが、ソリューションではこれが異なる場合があります。ディスク上の同じファイルを指す必要があります。デバッグ情報形式をC7に設定する必要があります(上記のスクリーンショットを参照)。そうしないと、Visual Studioはプロジェクトを並行してコンパイルできません。 「pdb」

私は何も忘れないことを望みます。私のソリューション(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の節約になります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top