2010-09-26 153 views
13

我越来越困惑,什么是编译器和链接PDB文件分别(即在Visual Studio中,Project Properties > C/C++ > Output Files > Program Database File NameVSProject Properties > Linker > Debugging之间的差异。我试图在网上找到答案,到目前为止我知道(可能是错误的)编译器的PDB文件生成obj文件,而PDB文件由链接器生成的二进制文件(exe或dll),并且是一个用于调试。编译器PDB文件和链接器PDB文件

如果不是这样,请说明不同之处。无论哪种方式,当我创建DLL时,我可以选择输出PDB文件以选择编译器以及链接器,以及在创建LIB文件时只执行编译器生成PDB文件的操作因为没有执行链接。

背景:库/ DLL是由几个项目,然后需要PDB文件用于调试。在lib文件的情况下,不存在歧义,因为只生成一个PDB文件。但是,在DLL的情况下,我是否需要PDB文件才能正确调试,或者只需要链接器生成的文件?

回答

12

老实说,我不知道到底是由编译步骤生成.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应匹配。

+0

(您更新之前发布此,但它适用于更新以及) 所以,当我创建'lib'文件(即静态库),只有编译器可以生成'PDB '文件,因为链接器不再需要,这是否意味着现在由编译器生成的'pdb'文件是调试所需的文件? – Samaursa 2010-09-26 01:36:46

+1

.lib文件不涉及程序的执行或调试。它们只是链接器的输入。 lib文件中适当的'stuff'可以作为二进制文件的一部分(对于静态库),或者用于创建DLL的动态链接(在导入库的情况下)。 无论在哪种情况下,您需要调试的.pdb文件都是在生成实际的.exe或.dll文件时由链接器生成的.pdb文件。 – 2010-09-26 01:57:23

+1

太好了,谢谢你对Michael的阐述,我会继续检查这个答案。虽然因为我们关于这个问题,如果你能回答这个问题。 Havok SDK是静态链接的,它的所有库都有它们各自的'PDB'文件。有趣的是,如果你在同一个目录下没有附带'PDB'文件的库链接,那么Visual Studio会给出大量的警告:'调试信息丢失,编译好像没有提供调试信息'(我是解释) – Samaursa 2010-09-26 02:10:36