昨天,我浏览了我们公司的项目并更新了它们以修正我们如何配置它们的错误(AFAIK)。
问题是在项目的属性页下,在Configuration Properties -> C/C++ -> Output Files
下,我们将Program Database File Name
设置为$(OutDir)$(TargetName).pdb
,我们设置的相同的值{ {1}}。
我的理解是第一个属性设置pdb文件的位置,该文件包含在编译源期间创建的目标文件的符号,而第二个属性设置pdb文件的位置,该文件包含生成的DLL的符号。这是对的吗?
在这个假设下,为了防止它们发生冲突(我认为这是不必要的)我将第一个属性设置为Configuration Properties -> Linker -> Debugging -> Generate Program Database File
,但这打破了生成的pdb文件(即调试器没有将其识别为DLL的pdb文件和同事在其上运行了一个工具,签名与二进制文件中包含的签名不匹配。
奇怪的是,使用值$(IntDir)$(TargetName).pdb
(注意' 2'后缀)可以解决问题。我不明白为什么中间文件的名称会很重要?
请注意,$(IntDir)$(TargetName)2.pdb
设置为Configuration Properties -> C/C++ -> General -> Debug Information Format
答案 0 :(得分:3)
我说你做得对:编译器生成目标文件。那时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
(绝对路径)相同的文件。在这种情况下,链接器可能无法写入文件,因为编译器仍在使用它或其他奇怪的东西。