編者:李國帥
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。