2013-04-30 41 views
15

我們已經通過了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。

+0

增量構建已知會導致此類問題。乾淨後徹底重建是否發生這種情況? – 2013-04-30 21:18:19

+0

是的,它正在建設和重建。我相信增量鏈接已關閉,但我們正在仔細檢查。 – Zac 2013-04-30 21:43:19

回答

6

對於pdb大小的確有最大限制1GB。 有一些技巧可以將它擴展到2GB(關於這方面的更多信息可以參考Here)。基本上你必須自己生成初始的pdb文件,而不是編譯器。

你可以做的其他事情是對你的模板代碼做一些主動提升,因爲這可能會影響你的pdb大小。

+0

鏈接到鉻中的相關變更集:https://chromium.googlesource.com/experimental/external/gyp/+/9ee1e40e50f3148f691965a0829709f0d25b0412 – 2016-02-11 13:25:57

0

您是否試圖減少並行構建的數量。在IDE中設置一些。在VC9上,我們遇到了類似的問題,我們唯一的解決方案是減少本地構建的數量。 它可能是內存問題嗎?您是否使用VC 10 SP1?

+0

一切都很好 - 所以我不知道爲什麼做/ MP編譯會產生影響。我們擔心鏈接器內存不足,它是32位版本(32位linker.exe)。我們正在使用SP1。 – Zac 2013-04-30 21:45:23

5

我把1000個cpp文件放在一起測試程序,每個cpp帶一個函數,實例化500個獨特的模板類型。

當PDB文件到達時,Link.exe失敗:1048575 KB。

在PDB格式或LINK.exe中似乎是1 GB的硬限制。

相關問題