C++ 使用Visual studio 2013为本机DLL正确生成PDB文件

C++ 使用Visual studio 2013为本机DLL正确生成PDB文件,c++,visual-studio,visual-studio-2013,pdb-files,C++,Visual Studio,Visual Studio 2013,Pdb Files,昨天,我浏览了我们公司的项目,并对其进行了更新,以修复我们如何配置它们的错误(AFAIK) 问题是,在项目的属性页下,在配置属性->C/C++->输出文件下,我们将程序数据库文件名设置为$(OutDir)$(TargetName).pdb,我们已经设置了相同的值配置属性->链接器->调试->生成程序数据库文件 我的理解是,第一个属性设置pdb文件的位置,其中包含源代码编译期间创建的目标文件的符号,而第二个属性设置pdb文件的位置,其中包含生成的DLL的符号。对吗 在这个假设下,为了防止它们发生冲

昨天,我浏览了我们公司的项目,并对其进行了更新,以修复我们如何配置它们的错误(AFAIK)

问题是,在项目的属性页下,在
配置属性->C/C++->输出文件
下,我们将
程序数据库文件名
设置为
$(OutDir)$(TargetName).pdb
,我们已经设置了相同的值
配置属性->链接器->调试->生成程序数据库文件

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

在这个假设下,为了防止它们发生冲突(我假设这是不需要的),我将第一个属性设置为
$(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->debug->Generate Program Database file

作为注释中提到的“汉斯本”,编译器设置不应该被触碰。太糟糕了。在Visual Studio 2013或2015 C++控制台应用程序中,C/C++ +>输出文件的默认值是<代码> $(Itdir)VC $(PrimoTooStValdVoice)。.pdb,因此最终名称类似于

Debug\vc120.pdb
Debug\vc140.pdb


总之,只要名称与链接器设置不冲突,更改编译器的输出文件应该无关紧要。这正是发生在您身上的情况:编译器名称
$(IntDir)$(TargetName)。pdb
(相对路径)解析为与链接器名称
$(OutDir)$(TargetName)相同的文件。pdb
(绝对路径)。在这种情况下,可能会发生链接器无法写入文件的情况,因为编译器或其他奇怪的东西仍在使用该文件。

当前模块的符号包含在文件中:链接器->调试->生成程序数据库文件。()这是您在调试期间应该使用的。Microsoft很久很久以前就犯了一个错误,这种错误是他们永远无法修复的。该.pdb文件不适用于调试器,也不包含调试信息。编译器使用它跟踪生成,以加快后续生成。更改设置没有用。您使用的是哪一个Nder-Link,还是C++下的链接?你有没有链接到相关文档?@ BWMAT:我认为它不重要。但是我实际上从来没有尝试过。你唯一不应该使用的名字是<代码> $(Itdir)$(TAGNOTE)。PDB< <代码>,因为它与链接器输出文件创建了名称冲突。@ BWMAT:添加到回答,但不应该造成冲突,链接器进入Outdir而另一个进入Ididir。@ BWMAT:在我的机器上从头开始的一个新C++解决方案中,IntDir是相对的,OutDir是绝对目录,但指向相同的直接。奥里。