[英]Generating PDB files correctly for a native DLL using Visual studio 2013
昨天,我浏览了我们公司的项目,并对其进行了更新,以解决如何配置它们的错误(AFAIK)。
问题在于,在项目的属性页下的“ Configuration Properties -> C/C++ -> Output Files
,我们将“ Program Database File Name
设置为$(OutDir)$(TargetName).pdb
,该值与我们设置“ Configuration Properties -> Linker -> Debugging -> Generate Program Database File
值相同 Configuration Properties -> Linker -> Debugging -> Generate Program Database File
。
我的理解是,第一个属性设置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 -> Debugging -> Generate Program Database File
。
正如@HansPassant在评论中提到的那样,不应更改编译器设置。 太糟糕了,它已经发生了。 在Visual Studio 2013或2015 C ++控制台应用程序中, C/C++ -> Output Files
的默认值为$(IntDir)vc$(PlatformToolsetVersion).pdb
,因此最终名称类似于Debug\\vc120.pdb
或Debug\\vc140.pdb
。
恕我直言,只要名称不与链接器设置冲突,更改编译器的输出文件就没有关系。 这就是发生的事情:编译器名称$(IntDir)$(TargetName).pdb
(相对路径)解析为与链接器名称$(OutDir)$(TargetName).pdb
(绝对路径)相同的文件。 在这种情况下,链接器可能无法写入文件,因为编译器或其他奇怪的东西仍在使用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.