gpt4 book ai didi

c++ - 使用 Visual Studio 2013 为 native DLL 正确生成 PDB 文件

转载 作者:搜寻专家 更新时间:2023-10-31 01:38:06 32 4
gpt4 key购买 nike

昨天,我检查了我们公司的项目并更新了它们以修复我们配置它们的错误 (AFAIK)。

问题是在项目的属性页下,在 Configuration Properties -> C/C++ -> Output Files 下,我们将 Program Database File Name 设置为 $(OutDir)$(TargetName).pdb,我们设置的 相同配置属性 -> 链接器 -> 调试 -> 生成程序数据库文件.

我的理解是,第一个属性设置 pdb 文件的位置,其中包含在编译源代码期间创建的目标文件的符号,而第二个属性设置包含生成的 DLL 符号的 pdb 文件的位置。对吗?

在这种假设下,为了防止它们发生冲突(我假设这是不需要的),我将第一个属性设置为 $(IntDir)$(TargetName).pdb,但这破坏了生成的 pdb 文件(即调试器不将其识别为 DLL 的 pdb 文件,并且同事在其上运行了一个工具,并且签名与二进制文件中包含的签名不匹配)。

奇怪的是,使用值 $(IntDir)$(TargetName)2.pdb(注意“2”后缀)修复了这个问题。我不明白为什么中间文件的名称很重要?

请注意,Configuration Properties -> C/C++ -> General -> Debug Information Format 设置为 Program Database (/Zi)

最佳答案

我会说你没看错:编译器生成目标文件。那时 DLL 还没有准备好,所以无论那个 PDB 文件包含什么,都对调试没有帮助。

链接器处理完编译器的输出后,DLL 就存在了。那时,PDB 对调试很有意义。因此用于调试目的的相关文件位于Linker -> Debugging -> Generate Program Database File

正如@HansPassant 在评论中提到的,不应触及编译器设置。可惜它已经发生了。在 Visual Studio 2013 或 2015 C++ 控制台应用程序中,C/C++ -> Output Files 的默认值为 $(IntDir)vc$(PlatformToolsetVersion).pdb,因此最终名称类似于 Debug\vc120.pdbDebug\vc140.pdb

恕我直言,只要名称不与链接器设置冲突,更改编译器的输出文件应该无关紧要。这正是您遇到的情况:编译器名称 $(IntDir)$(TargetName).pdb(相对路径)解析为与链接器名称相同的文件 $(OutDir)$(TargetName .pdb(绝对路径)。在那种情况下,链接器可能无法写入文件,因为它仍在被编译器或其他奇怪的事情使用。

关于c++ - 使用 Visual Studio 2013 为 native DLL 正确生成 PDB 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33292241/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com