連結器的嚴重錯誤︰ LNK1102︰ 記憶體不足

適用於: Visual Studio 2010 Professional

狀況


假設您建置大型的專案使用 x86 (32 位元) 的工具設定 (整個程式最佳化[WPO] 啟用)。這暗示著連結時間程式碼產生 (LTCG)。

在這個案例中,連結器可能會回報 (不足 OOM) 的問題,導致建置失敗的記憶體不足。例如, Mozilla 要在 Firefox可能無法充分善用 WPO,因為連結器會耗盡 x86 32 位元位址空間。

原因


多半是因為大量的堆積空間所需的編譯器 LTCG 期間,發生這個問題。一般而言,連結器會繫結的磁碟 I/O,而不會使用編譯器為太多的記憶體。不過,連結器未在 LTCG 期間叫用編譯器。

連結器與編譯器都各有自己的堆集管理架構。它們並沒有與彼此發生位址空間壓力時協助進行通訊的機制。此外,因為編譯器的很重,而且經常 spikey 的記憶體使用量,有可能是導致失敗,要求少量的堆積空間時的位址空間中的嚴重分散。

解決方案


在 Visual Studio 2013 Microsoft,我們引進了一種機制,確保在堆積配置不成功,編譯器會將這傳達給連結器,連結器會釋出對應的檔案時釋放部分的堆積空間。我們也實作了一個機制,以確定當記憶體壓力增加時,編譯器會增加堆積配置,以協助進行分散問題中的頁面大小。不過,我們建議您採取編譯器工具,如果您正接近 32 位元位址空間的限制設定跨 x64 (64 位元) 的優點。

在 Visual Studio 2013年 (下載這裡),我們也介紹了 「 x64 交叉工具 」。這包括 64 位元交互編譯器/連結器來建置 「 「 x86 」 和 「 手臂 」 「 平台。這是可以在 Visual Studio 2012 和較早版本的工具集跨 x86 (32 位元) 之外。本文中的使用者可以列印文件的使用,請跨工具集 x64 (64 位元) 的概觀。如果您不能移到 Visual Studio 2013年,您可以使用下列因應措施,Visual Studio 2012 與較早的版本︰
  • 如果您的應用程式要針對 x64 平台,使用 x64 的工具,來建置您的應用程式設定。您可以找到如何使用 x64 的指示工具組這裡
  • 如果您目前正在建置您的應用程式,在 x86 作業系統上,移至 x64 作業系統。這樣會引發從 2 gb 的可用虛擬位址空間 4 gb。
  • 如果您目前正在編譯在 x86 作業系統上,並不能移動到 x64 作業系統,使用/3GB 啟動切換。這樣會引發至 3 GB 的可用虛擬位址空間。

更多的資訊


下圖所示,您可以在您 %安裝 Path%\Microsoft Visual Studio 12.0\VC\bin 目錄中,找到兩 x64 架構跨工具組。





Amd64_x86 和 amd64_arm 的資料夾會包含所有項目,您必須使用跨工具組的 x64 建置為 x86 和 arm 目標。

MSBuild 使用者


如果您目前使用 MSBuild 時您的建置程序的一部份,您可以利用稱為PreferredToolArchitecture的新專案層級屬性。這個屬性可讓使用者選取哪一項工具設定 (x86 或 x64),用來建置應用程式。

當您使用/p:PreferredToolArchitecture = x64引數加上msbuild命令、 該目標 x64 平台,建置應用程式時,會使用原生的工具集 (VC\bin\amd64) 的 x64 和 x64 該目標 x86 平台建置應用程式時,會使用跨工具集 (VC\bin\amd64_x86)。


Visual Studio IDE 的使用者

在 Visual Studio IDE 現成不支援跨工具 x64。我們將會解決這個問題在未來。不過,下列解決方法應該讓您利用 x64 跨工具在 Visual Studio IDE 中︰
  1. 啟動 Visual Studio 2013年開發人員的命令提示字元。您可以在 Windows [開始] 畫面中,找到開發人員的命令提示字元,如下所示。


  2. 開發人員在命令提示字元中,會設定PreferredToolArchitecture屬性,以指向您想要用來建置您的目標應用程式的工具集。
  3. 從開發人員的命令提示字元啟動 Visual Studio (devenv)。此外,您現在應該可以善用跨工具。



請確認使用的是正確的工具組的快速方法之一是建立並建置應用程式具有其他編譯器旗標/Bt/Bt編譯器旗標串出此外花在 C1、 C1XX,和 C2 Dll。 的時間相關的詳細資訊,它提供在哪一項工具組用來建置目標應用程式的詳細資料。在 [專案屬性頁] 下,可以套用/Bt旗標 (組態屬性--> c + + 命令列-->)。下圖中,這個工具設定,請注意正在使用 (amd64_x86)。