1

あるプロジェクトでコンパイルされ、他のプロジェクトで使用される共有 .pch ファイルを使用しようとしています。

ただし、PCH プロジェクトの .pdb ファイル名が他のプロジェクトの .pdb ファイル名と異なる場合、.pch ファイルは削除されます。

このページは質問に答えていません: https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio/

すべての PDB に同じ名前を使用したくありません。

質問:

1) そのページのように PDB 名が等しくない場合、他のプロジェクトのコンパイルの開始時に .pch ファイルが削除され、C1083 エラー (.pch が見つからない) が発生するのはなぜですか?

2) COPY コマンドを使用して pch.pdb および pch.idb ファイルをコピーします。コピーされた pch.pdb に依存プロジェクトの PDB と同じ名前を付ける必要がある場合、RENAME コマンドなどはありますか? また、Custom Build Step コマンドの完全なリストはどこにありますか?

3) カスタム ビルド ステップの「追加の依存関係」と「出力」の目的がわかりません。.pch ファイル名を依存関係リストに入力して、削除されないようにすることはできますか? 出力リストには、依存プロジェクトの PDB 名、pch.pdb、またはその両方を含める必要がありますか?

4

2 に答える 2

1

github リンクの下にあるサンプル コードを使用しましたか。

その場合は、そのサンプルをダウンロードして使用する必要があります。独自のプロジェクトを作成する場合は、プロジェクトを注意深く確認する必要があります。

このチュートリアルをあなたのプロジェクトに当てはめてみると、 PCHxxx.vcxprojファイルを削除するためにファイルに追加のカスタム ターゲットがあるかどうかに注意を払う必要があると思います。したがって、各ファイルを注意深く確認する必要があります。vs では、PCH プロジェクトと他のプロジェクトの .pdb ファイル名が異なるため、特定のファイルが削除されないため、独自の追加操作がないか確認してください。xxx.vcxproj

1) そのページのように PDB 名が等しくない場合、他のプロジェクトのコンパイルの開始時に .pch ファイルが削除され、C1083 エラー (.pch が見つからない) が発生するのはなぜですか?

まず、プロジェクトで PCH ファイルを削除する他のオプションがないことを確認してください。

PCH プロジェクトは PCH ファイルを作成し、他の 2 つのプロジェクトはそのファイルを使用します。また、2 つのプロジェクトをビルドするたびに (PCH プロジェクトを参照)、常に PCH プロジェクトのビルドを実行してから 2 つのプロジェクトをビルドします。したがって、PCH は常に作成され、後で 2 つのプロジェクトで使用されます。

これに基づいて、3 つのプロジェクトすべてがファイルに対して同じアドレスを作成して使用するようにする必要があります。

SharedPCH プロジェクト

ここに画像の説明を入力

ConsoleApplication1

ここに画像の説明を入力

ConsoleApplication2

ここに画像の説明を入力

サンプルコードでは、PCHファイルは の下にありSharedPchSample\Outputs\Intermediate\Shared\Win32\Debugます。

2) COPY コマンドを使用して pch.pdb および pch.idb ファイルをコピーします。コピーされた pch.pdb に依存プロジェクトの PDB と同じ名前を付ける必要がある場合、RENAME コマンドなどはありますか? また、Custom Build Step コマンドの完全なリストはどこにありますか?

カスタムビルドステップはすべてのプロジェクトの下にあります--> Properties--> Custom Build Step--> Command Line、そしてそれを見つけることができます.そのカスタムステップは単なるCMDコマンドです. その中でCMDを実行して、追加の操作を行うことができます。

あと、区別するために、プロジェクト名と同じ名前にしxxx.pdbたいのでしょうね。xxx.idbすべてのプロジェクトを右クリック-> Properties--> C/C++--> Output Files--> Program Database File Name-->変更して使用できます$(IntDir)$(ProjectName).pdbカスタム ビルド ステップの詳細については、このリンクを参照してください。

カスタム ビルド ステップの「追加の依存関係」と「出力」の目的がわかりません。.pch ファイル名を依存関係リストに入力して、削除されないようにすることはできますか? 出力リストには、依存プロジェクトの PDB 名、pch.pdb、またはその両方を含める必要がありますか?

Additional dependenciesプロジェクト 1 と 2 で PCH ファイルのコンテンツを使用するように設定されています。これは、C++ プロジェクトで参照クラス ライブラリのアドレスを構成するのと似ています。そして、それは冗長かもしれないと思います.著者がそれを追加したので、それは十分に根拠があることを意味します.

また、Outputsは作成者がカスタマイズした出力パスです。作成者はプロジェクトの出力アドレスを変更し、新しいカスタム出力パスと一時的な出力パスを開始しました。

実際には、xxx.pchそのファイルは出力パスにコピーされません。したがって、カスタム ビルドの手順は、ファイルを一時的な出力パスにコピーすることです。それらを最終的な出力パスにコピーしたい場合は、これらをファイルで使用することもできます。pdbidbCustomBuildStep.targets

<CustomBuildStep>
<Command>
if EXIST "$(SharedPdb)" xcopy /Y /F "$(SharedPdb)" "$(IntDir)"
if EXIST "$(SharedIdb)" xcopy /Y /F "$(SharedIdb)" "$(IntDir)"
if EXIST "$(SharedPdb)" xcopy /Y /F "$(SharedPdb)" "$(OutDir)"
if EXIST "$(SharedIdb)" xcopy /Y /F "$(SharedIdb)" "$(OutDir)"
</Command>
<Outputs>$(IntDir)vc$(PlatformToolsetVersion).pdb;</Outputs>
<Inputs>$(SharedPdb)</Inputs>
</CustomBuildStep>

実際、あるプロジェクトが別のプロジェクトを参照し、参照されたプロジェクトの出力ファイルが自動的にメイン プロジェクトにコピーされます。おそらくこれは、作成者の SharePCH プロジェクトが pdb および idb ファイルを生成しないため、依存プロジェクトのそれらのファイルがメイン プロジェクトで見つからないためです。

于 2020-05-08T08:07:31.493 に答える