Visual Studio删除共享的.pch文件,以及有关自定义生成步骤的问题

问题描述 投票:0回答:2

我尝试使用共享的.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命令或其他内容?在哪里可以找到“定制构建步骤”命令的完整列表?

3)我不了解“自定义构建步骤”中“其他依赖项”和“输出”的目的。我可以将.pch文件名输入到依赖项列表中,这样它不会被删除吗?输出列表是否需要包含从属项目的PDB名称或pch.pdb,或两者都包含?

c++ visual-studio msbuild precompiled-headers custom-build-step
2个回答
1
投票

您是否使用了github link下的示例代码。

如果是这样,则应下载然后使用该示例,如果创建自己的项目,则应仔细检查项目。

[从本教程浏览到您的项目,我认为您需要注意xxx.vcxproj文件中是否还有其他自定义目标,以删除PCH文件。因此,您需要仔细检查每个xxx.vcxproj文件。在vs中,由于PCH项目和其他项目的.pdb文件名不同,因此不会删除某些文件,因此请检查是否还有自己的其他操作。

1)为什么在其他项目开始时删除.pch文件编译,如果存在PDB,则会导致C1083错误(未找到.pch)名称不相等,不是该页面中一样吗?

首先,请确保没有其他选项可以删除项目中的PCH文件。

PCH项目将创建一个PCH文件,其他两个项目将使用该文件。并且每次构建两个项目时(请参考PCH项目),始终执行PCH项目的构建,然后再构建两个项目。因此,始终创建PCH,以后再在两个项目中使用。

<< [Based上,您应确保所有三个项目都为文件创建并使用相同的地址。

SharedPCH项目

enter image description here

ConsoleApplication1

enter image description here

ConsoleApplication2

enter image description here

在示例代码中,

PCH

文件存在于SharedPchSample\Outputs\Intermediate\Shared\Win32\Debug下。
2)我使用COPY命令复制pch.pdb和pch.idb文件,重命名命令或其他名称,如果复制的pch.pdb应该命名为像从属项目的PDB?在哪里可以找到完整列表自定义构建步骤命令?

自定义构建步骤

位于每个项目下-> Properties-> Custom Build Step-> Command Line,然后您可以找到它。该自定义步骤就是CMD命令。然后,您可以执行CMD来进行额外的操作。

Besides

,我想您想将这些xxx.pdbxxx.idb命名为项目名称的相同名称,以便彼此区分。您可以右键单击每个项目-> Properties-> C/C++-> Output Files-> Program Database File Name->更改它并使用$(IntDir)$(ProjectName).pdb。有关自定义构建步骤的更多信息,可以参考this link
我不了解“附加依赖项”的目的,并且自定义构建步骤中的“输出”。我可以在.pch文件名中输入依赖项列表,因此它不会被删除?输出列表是否需要是否包含从属项目的PDB名称或pch.pdb,或两者都包含?

Additional dependencies被设置为在项目1和2中使用PCH文件的内容,这与在c ++项目中配置参考类库的地址类似。而且我认为这可能是多余的,并且由于作者添加了它,这意味着它是有充分根据的。

并且

Outputs

是作者定制的输出路径,作者更改了项目的输出地址,并启动了新的定制输出路径和临时输出路径。

Actually

xxx.pch及其pdbidb文件不会复制到输出路径中。因此,自定义构建步骤是将文件复制到临时输出路径。如果要将它们复制到最终输出路径中,也可以在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>
实际上,一个项目引用了另一个项目,并且所引用项目的输出文件会自动复制到主项目中。也许这是因为作者的SharePCH项目没有生成pdb和idb文件,因此在主项目中找不到依赖项目的那些文件。

0
投票
出于某种原因(无论是否执行此操作),编译器.pdb文件生成的不是$(PlatformToolsetVersion).pdb,而是$(ProjectName).pdb。因此,在我的情况下,复制到其他项目文件夹共享.pdb​​文件的文件是pch.pdb,而其他项目期望使用不同的名称。这将触发Microsoft.CppCommon.targets中的DELETE任务(“如果pdb文件已删除,则删除pch文件。”)。我没有更改输出.pdb名称,而是查看了XCOPY命令,并使其将复制的文件名更改为特定项目所期望的名称(实际上,我只是将带有重命名复制任务的自定义目标添加到了项目文件中,而不是使用CustomBuildStep调用xcopy OS的命令,因为现在我了解了有关MSBuild的更多信息。

然后,我还更改了Linker输出.pdb生成的文件,只是在名称后添加了“ Linked”后缀,因此在Compiler和Linker的pdb之间没有冲突。不知道在没有太大理由的情况下更改默认设置是否是个好主意。

我想最好将编译器的输出PDB更改为$(PlatformToolsetVersion).pdb,这样所有项目都将使用相同的名称。

这是我第一次研究MSBuild和高级项目设置,现在看来很明显,使用共享.pdb​​的项目需要一个熟悉的.pdb名称,而不是一个随机的pch.pdb

这里是我的自定义目标导入到项目文件中,仅在重建共享.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>

© www.soinside.com 2019 - 2024. All rights reserved.