我尝试使用共享的.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,或两者都包含?
您是否使用了github link下的示例代码。
如果是这样,则应下载然后使用该示例,如果创建自己的项目,则应仔细检查项目。
[从本教程浏览到您的项目,我认为您需要注意xxx.vcxproj
文件中是否还有其他自定义目标,以删除PCH文件。因此,您需要仔细检查每个xxx.vcxproj
文件。在vs中,由于PCH项目和其他项目的.pdb文件名不同,因此不会删除某些文件,因此请检查是否还有自己的其他操作。
1)为什么在其他项目开始时删除.pch文件编译,如果存在PDB,则会导致C1083错误(未找到.pch)名称不相等,不是该页面中一样吗?
首先,请确保没有其他选项可以删除项目中的PCH文件。
PCH项目将创建一个PCH文件,其他两个项目将使用该文件。并且每次构建两个项目时(请参考PCH项目),始终执行PCH项目的构建,然后再构建两个项目。因此,始终创建PCH,以后再在两个项目中使用。
<< [Based上,您应确保所有三个项目都为文件创建并使用相同的地址。
SharedPCH项目
ConsoleApplication1
ConsoleApplication2
在示例代码中,
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.pdb
和xxx.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
及其pdb
和idb
文件不会复制到输出路径中。因此,自定义构建步骤是将文件复制到临时输出路径。如果要将它们复制到最终输出路径中,也可以在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文件,因此在主项目中找不到依赖项目的那些文件。
然后,我还更改了Linker输出.pdb生成的文件,只是在名称后添加了“ Linked”后缀,因此在Compiler和Linker的pdb之间没有冲突。不知道在没有太大理由的情况下更改默认设置是否是个好主意。
我想最好将编译器的输出PDB更改为$(PlatformToolsetVersion).pdb,这样所有项目都将使用相同的名称。
这是我第一次研究MSBuild和高级项目设置,现在看来很明显,使用共享.pdb的项目需要一个熟悉的.pdb名称,而不是一个随机的pch.pdb