解決visual studio 2010下warning LNK4099 PDB vc100.pdb was not found問題

 

編者:李國帥

qq:9611153 微信lgs9611153

時間:2018-2-7

 

問題描述及期望效果:

以前用visual studio 2008時也碰到過類似問題, 問題產生的原因就是由於一個Solution下單多個Project是分開編譯的,主項目和子項目的pdb文件名相同(默認都是vc90.pdb或vc100.pdb)從而造成衝突。這個問題對程序的執行不會產生影響,但會導致丟失部分調試信息。

 

網上方法:

在網上搜到解決辦法,修改pdb文件設置的路徑和名稱。轉貼於此。

 

Project Configuration Properties -> C/C++ -> Output Files -> Program Database File

 

This name, e.g. $(IntDir)\vc90.pdb, is embedded into the object file and it should be the same as the one in

Project Configuration Properties -> Linker -> Debugging ->Generate Program Database File

This is, e.g. $(TargetDir)$(TargetName).pdb

Now the object file contain the path where the library is located, too.

 

由此引出一個話題,那就是對於分開編譯的多個Project組成的一個複雜的Solution。如何組織目錄文檔結構,既保持各個Project相對獨立,同時又保證整個Solution調試信息的完整性。

 

我的解決辦法:

首先肯定要像上面一樣修改各單獨Project的pdb的路徑和文件名。

其次在複製Project編譯結果到Solution的Lib時,要把所有的obj文件和pdb文件一起copy過來。要注意單獨的Project編譯的obj文件和pdb文件路徑最好相同,而且使用相對路徑"..\"和“.\"打頭。

文件複製工作可以寫成一個批處理,放入主Solution的Pre-Build Event中去。

 

消除warning其他方法:

 

在工程屬性頁 配置 release 平臺 活動(win32)設置:

配置屬性 -> 鏈接器 -> 調試 -> 生成調試信息 -> 否

 

程序數據庫(PDB)文件保存着調試和項目狀態信息,使用這些信息可以對程序的調試配置進行增量鏈接。

當以/ZI或/Zi(用於C/C++)生成時,將創建一個PDB文件。

 

在VisualC++中,/Fd選項用於命名由編譯器創建的PDB文件。當使用嚮導在VisualStudio中創建項目時,/Fd選項被設置爲創建一個名爲project.PDB的PDB。

 

如果使用生成文件創建C/C++應用程序,並指定/ZI或/Zi而不指定/Fd時,則最終將生成兩個PDB文件:

  *VC80.PDB (更籠統地說就是VCx0.PDB,其中x表示VisualC++的版本。)該文件存儲各個OBJ文件的所有調試信息並與項目生成文件駐留在同一個目錄中。

  *project.PDB 該文件存儲.exe文件的所有調試信息。對於C/C++,它駐留在/debug子目錄中。

 

每當創建OBJ文件時,C/C++編譯器都將調試信息合併到VCx0.PDB中。插入的信息包括類型信息,但不包括函數定義等符號信息。因此,即使每個源文件都包含公共頭文件(如<windows.h> ),這些頭文件中的typedef也只存儲一次,而不是在每個OBJ文件中都存在。

 

鏈接器將創建project.PDB,它包含項目的EXE文件的調試信息。project.PDB文件包含完整的調試信息(包括函數原型),而不僅僅是在VCx0.PDB中找到的類型信息。這兩個PDB文件都允許增量更新。鏈接器還在其創建的.exe或.dll文件中嵌入.pdb文件的路徑。

 

VisualStudio調試器使用EXE或DLL文件中的PDB路徑查找project.PDB文件。如果調試器在該位置無法找到PDB文件或者如果路徑無效(例如,如果項目被移動到了另一臺計算機上),調試器將搜索包含EXE的路徑,即在“選項”對話框(“調試”文件夾,“符號”節點)中指定的符號路徑。調試器不會加載與所調試的二進制不匹配的PDB。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章