我們已經通過了MSDN WRT上列出的這個錯誤的要點(除了#5)。不同機器上的三個不同人遇到同樣的問題。 PDB已創建,但在中間某處失敗。LNK1201 Visual C++ 2010大型項目未能生成PDB
詳情:
- 67個靜態庫
- 4.27 GB靜態庫
- 1048575字節 - PDB的大小時,連接失敗
- 近一的PDB的兆字節爲null(零的)
- 發佈版本成功&產生一個PDB(我們打開它,exe中沒有調試信息)
- 發佈版本PDB僅低於1 GB。
我們禁用了病毒掃描程序。用procmon.exe觀察,發現鏈接器失敗時沒有懷疑與PDB的交互。
Related question建議對PDB的限制爲1GB - 任何人/方式來確認?
UPDATE & SOLUTION:
@Barry和鉻的團隊已經拿出解決方案。 Here是實現分辨率的Chromium構建系統的修補程序。
詳細
的PDB使用虛擬文件系統內部:MSF。當鏈接器創建PDB文件時,它默認爲一個(顯然是不可配置的)2 kB頁面大小。顯然&幸運的是,當編譯器創建它的PDB時,它默認頁面大小爲4kB。該編譯器PDB可以被掛起並用作鏈接器PDB的基礎。
更好的解決方案 作爲對被鏈接你的EXE或DLL我們可以扯起編譯器生成我們需要的初始PDB的項目前鏈路事件:
cl -c "dummy_empty.cpp" /Zi /Fd"$(TargetDir)$(TargetName).pdb"
原液
使用空cpp文件創建C++靜態庫項目,配置'Porgram數據庫文件名'輸出非默認值。使用一些項目構建事件(我使用'Pre-Link Event')將以前創建的PDB複製到鏈接器所期望的位置(請參閱鏈接器 - >生成程序數據庫文件)以創建其PDB。幸運的是,鏈接器將採用PDB中的拷貝並使用其4 kB頁面大小。這會花費一些時間,並且有些空間可以達到2GB的PDB。
增量構建已知會導致此類問題。乾淨後徹底重建是否發生這種情況? – 2013-04-30 21:18:19
是的,它正在建設和重建。我相信增量鏈接已關閉,但我們正在仔細檢查。 – Zac 2013-04-30 21:43:19