编译器PDB文件和链接器PDB文件

20
我开始对编译器和链接器分别生成的“PDB”文件存在什么区别感到困惑了 (即在 Visual Studio 中,“项目属性 > C/C++ > 输出文件 > 程序数据库文件名”与“项目属性 > 链接器 > 调试”)。我尝试在网上寻找答案,并且到目前为止我所知道的是(可能不正确),编译器生成的PDB文件用于obj文件,而链接器生成的PDB文件用于二进制文件(exe 或 dll)并用于调试。
如果这不正确,请解释区别。无论哪种情况,在创建DLL时我该如何选择编译器和链接器的输出PDB文件,在创建LIB文件时只有编译器生成PDB文件因为没有进行链接。

背景:库/动态链接库被多个项目使用,然后需要PDB文件进行调试。对于lib文件来说,没有歧义,因为只会生成一个PDB文件。但是对于DLL来说,我是否需要两个PDB文件才能正确调试或者只需要由链接器生成的一个?

1个回答

16

我并不完全清楚编译步骤生成的 .pdb 文件具体用途是什么——我猜测它是一些中间信息,由链接器拉入最终的 .pdb 文件中。

然而,归根结底,为了调试目的,你只需要链接器生成的 .pdb 文件。


更新:从http://blogs.msdn.com/b/yash/archive/2007/10/12/pdb-files-what-are-they-and-how-to-generate-them.aspx 获得以下信息:

.PDB 文件有哪两种类型?

=================================

有两种 .PDB 文件。一种是由编译器生成的,名为 VCx0.PDB(例如 vc80.pdb),还有另一种是 .PDB。

VCx0.PDB 文件由编译器生成,与 .OBJ 文件相关联。它仅包含类型信息。

.PDB 文件由链接器生成,与目标可执行文件或 DLL 相关联。该文件包含完整的调试信息。当我们进行调试时,需要此 '.pdb' 文件来对齐符号。目标文件和 PDB 的时间戳应匹配。


1
当我创建lib文件(即静态库)时,只有编译器才能生成pdb文件,因为链接器不再需要,这是否意味着现在由编译器生成的pdb文件是用于调试的文件? - Samaursa
2
.lib文件不参与程序的执行或调试,它们只是链接器的输入。在静态库的情况下,lib文件中适当的内容将成为二进制文件的一部分;在导入库的情况下,它将用于创建到DLL的动态链接。在这两种情况下,你需要进行调试的.pdb文件是由链接器在实际的.exe或.dll文件生成时产生的。 - Michael Burr
1
太好了,感谢Michael的详细解释,我会去检查这是否是正确答案。虽然既然我们正在讨论这个主题,如果您能回答这个问题就更好了。 Havok SDK是静态链接的,所有库都带有各自的“PDB”文件。有趣的地方在于,如果您链接到没有伴随在同一目录中的“PDB”文件的库,那么Visual Studio会给出大量警告,指出“缺少调试信息,编译时好像未提供调试信息”(我进行了类比)。 - Samaursa
@Samuarsa:.pdb 文件的文件名是什么样的?它们都是 VCxx.PDB 吗?还是 foo.lib 的那些在 foo.pdb 中? - SamB
@SamB 三年晚了,但是为了以后的参考:foo.lib 的那些在 foo.pdb 中。 - Samaursa
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接