簡體   English   中英

Visual Studio刪除一個shared.pch文件,關於自定義構建步驟的問題

[英]Visual Studio deletes a shared .pch file, and questions about custom build steps

我嘗試使用 shared.pch 文件,該文件在一個項目中編譯並在其他項目中使用。

但是,如果 PCH 項目的 .pdb 文件名與其他項目的 .pdb 文件名不同,.pch 文件將被刪除。

此頁面未回答問題: https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio/

我不想對所有 PDB 使用相同的名稱。

問題:

1)為什么在其他項目編譯開始時.pch文件被刪除,導致C1083錯誤(找不到.pch),如果PDB名稱不相等,不像那個頁面?

2) 我使用 COPY 命令復制 pch.pdb 和 pch.idb 文件,是否有 RENAME 命令或其他東西,如果復制的 pch.pdb 應該像依賴項目的 PDB 一樣命名? 我在哪里可以找到自定義構建步驟命令的完整列表?

3) 我不明白自定義構建步驟中“附加依賴項”和“輸出”的用途。 我可以在依賴列表中輸入.pch 文件名,這樣它就不會被刪除嗎? output 列表是否需要包含依賴項目的 PDB 名稱或 pch.pdb 或兩者?

您是否使用了github 鏈接下的示例代碼。

如果是這樣,您應該下載並使用該示例,如果您創建自己的項目,則應仔細檢查您的項目。

借用本教程到你的項目,我想你需要注意你的xxx.vcxproj文件中是否有任何額外的自定義目標來刪除PCH文件。 因此,您需要仔細檢查每個xxx.vcxproj文件。 在vs中,由於PCH項目和其他項目的.pdb文件名不同,不會刪除某些文件,所以檢查一下是否有自己的額外操作。

1)為什么.pch文件在其他項目編譯開始時被刪除,導致C1083錯誤(.pch not found),如果PDB名稱不相等,不像那個頁面?

首先,確保沒有其他選項可以刪除項目中的 PCH 文件。

PCH 項目是創建一個 PCH 文件,另外兩個項目是使用這個文件。 並且每次構建兩個項目時(參考PCH項目),總是執行PCH項目的構建然后構建兩個項目。 所以 PCH 總是被創建,然后在兩個項目中使用。

基於此,您應該確保所有三個項目都為文件創建和使用相同的地址。

SharedPCH 項目

在此處輸入圖像描述

控制台應用程序1

在此處輸入圖像描述

控制台應用程序2

在此處輸入圖像描述

在示例代碼中, PCH文件位於SharedPchSample\Outputs\Intermediate\Shared\Win32\Debug下。

2)我使用 COPY 命令復制 pch.pdb 和 pch.idb 文件,如果復制的 pch.pdb 應該像依賴項目的 PDB 一樣命名,是否有 RENAME 命令或其他東西? 我在哪里可以找到自定義構建步驟命令的完整列表?

自定義構建步驟在每個項目下--> Properties -> Custom Build Step -> Command Line ,然后你就可以找到它。自定義步驟只是CMD命令。 您可以在其中執行 CMD 進行額外操作。

此外,我猜你想讓那些xxx.pdbxxx.idb與項目名稱相同,以便相互區分。 您可以右鍵單擊每個項目 --> Properties --> C/C++ --> Output Files --> Program Database File Name --> 更改它並使用$(IntDir)$(ProjectName).pdb 有關自定義構建步驟的更多信息,您可以參考此鏈接

我不明白自定義構建步驟中“附加依賴項”和“輸出”的目的。 我可以將.pch文件名輸入到依賴列表中,這樣它就不會被刪除? output 列表是否需要包含依賴項目的 PDB 名稱或 pch.pdb 或兩者?

Additional dependencies項設置為使用項目 1 和 2 中的 PCH 文件內容,這類似於在 c++ 項目中配置參考 class 庫的地址。 而且我認為這可能是多余的,因為作者添加了它,這意味着它是有根據的。

And Outputs is the author customized output path, the author changed the output address of the project, and started a new custom output path and a temporary output path.

實際上,不會將xxx.pch及其pdbidb文件復制到 outputpath 中。 所以自定義構建步驟是將文件復制到臨時 output 路徑中。 如果你想將它們復制到最終的輸出路徑中,你也可以在CustomBuildStep.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>

而事實上,一個工程引用了另一個工程,被引用工程的output文件會自動復制到主工程中。 可能是因為作者的SharePCH項目沒有生成pdb和idb文件,所以在主項目中找不到那些依賴項目的文件。

由於某種原因(我是否這樣做),compiler.pdb 文件生成的不是 $(PlatformToolsetVersion).pdb,而是 $(ProjectName).pdb。 因此,在我的情況下,復制到其他項目文件夾 shared.pdb 文件是 pch.pdb ,而其他項目期望不同的名稱。 這觸發了 Microsoft.CppCommon.targets 中的 DELETE 任務,(“如果 pdb 文件已被刪除,則刪除 pch 文件。”)。 而不是更改 output.pdb 名稱,我只是查看了 XCOPY 命令並將復制的文件名更改為特定項目所期望的(實際上,我只是將帶有重命名復制任務的自定義目標添加到項目文件中,而不是使用 CustomBuildStep 調用 xcopy 操作系統的命令,因為現在我了解了有關 MSBuild 的更多信息)。

然后我也改了Linker生成的output.pdb,只是在名字后面加了“Linked”后綴,這樣編譯器和鏈接器的PDB就沒有沖突了。 不確定在沒有很大原因的情況下更改默認設置是否是個好主意。

我想最好將編譯器的 output PDB 更改為 $(PlatformToolsetVersion).pdb,這樣所有項目都將使用相同的名稱。

那是我第一次查看 MSBuild 和高級項目設置,現在似乎很明顯,使用 shared.pdb 的項目需要一些熟悉的.pdb 名稱,而不是隨機的 pch.pdb

這是我導入到項目文件中的自定義目標,僅在重新構建時復制 shared.pdb(在我的情況下未生成 .idb):

<Target Name="CopyFreshPchPdb" BeforeTargets="ClCompile" 
    Inputs="$(PchDir)\pch.pdb"
    Outputs="$(IntDir)\$(ProjectName).pdb">
    <Message  Importance="High" Text="Copying shared pch.pdb" />
    <Copy
        SourceFiles="$(PchDir)\pch.pdb"
        DestinationFiles="$(IntDir)\$(ProjectName).pdb">
    </Copy>
</Target>

我想補充一點,我遇到過類似的情況,其中 shared.pch 文件被刪除,但出於與 .pdb 文件相關的不同原因。

原因是 exe 和 PCH.lib 中的 pdb 格式不同。 PCH 庫項目的“項目屬性 -> C/C++ -> 常規 -> 調試信息格式”設置為“C7 兼容 (/Z7)”。

當我添加一個依賴於 PCH 庫的新項目 exe 時,我忘記了新項目默認使用“程序數據庫 (/Zi)”作為其“調試信息格式”。

所以現在當主項目正在構建並與 PCH 鏈接時,它會刪除 PCH.pch 文件並抱怨缺少 .PCH。

讓所有項目都具有相同的匹配調試信息格式是防止 PCH 被刪除的修復方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM