Emi*_*rov 5 c++ msbuild custom-build-step precompiled-headers visual-studio
我尝试使用共享的 .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 文件名输入到依赖项列表中,这样它就不会被删除吗?输出列表是否需要包含依赖项目的 PDB 名称或 pch.pdb,或两者都包含?
由于某种原因(无论我是否这样做),编译器生成的 .pdb 文件不是 $(PlatformToolsetVersion).pdb ,而是 $(ProjectName).pdb 。因此,在我的例子中,复制到其他项目文件夹共享的 .pdb 文件是 pch.pdb,而其他项目则需要不同的名称。这会触发 Microsoft.CppCommon.targets 中的 DELETE 任务(“如果 pdb 文件已被删除,则删除 pch 文件。”)。我没有更改输出 .pdb 名称,而是查看了 XCOPY 命令,并将复制的文件名更改为特定项目所需的名称(实际上,我只是添加了一个自定义目标,并将重命名复制任务直接添加到项目文件中,而不是使用 CustomBuildStep 调用 xcopy OS 的命令,现在我了解了有关 MSBuild 的更多信息)。
然后我还更改了链接器输出生成的.pdb,只是在名称中添加了“Linked”后缀,因此编译器和链接器的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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
859 次 |
| 最近记录: |