2010-09-26 99 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