鏈接器嚴重錯誤:LNK1102:記憶體不足

本文可協助您解決使用 x86 (32 位) 工具組建置大型專案時所擲回的記憶體不足錯誤。

原始產品版本:Visual Studio Professional 2010 年
原始 KB 編號: 2891057

徵狀

假設您使用 x86 (32 位) 工具集建置大型專案, (啟用 整個程式優化) 。 這表示連結時間程式代碼產生 (LTCG) 。

在此案例中,連結器可能會回報記憶體不足 (OOM) 導致建置失敗的問題。

原因

此問題發生的原因大多是因為編譯程式在 LTCG 期間需要大量的堆積空間。 一般而言,連結器是磁碟輸入/輸出 (I/O) 系結,且不會使用與編譯程式一樣多的記憶體。 不過,鏈接器確實會在 LTCG 期間叫用編譯程式。

鏈接器和編譯程式各自有自己的堆積管理配置。 它們沒有彼此通訊的機制,可在達到空間壓力時提供協助。 此外,由於編譯程式中的記憶體使用量過重且經常暴增,因此在要求少量堆積空間時,位址空間中可能會有嚴重的分散,導致失敗。

解決方案

在 Microsoft Visual Studio 2013 中,我們引進了一個機制,可確保堆積配置失敗時,編譯程式會將它傳達給連結器,而鏈接器會釋出對應的檔案來釋出一些堆積空間。 我們也實作了一個機制,以確保當記憶體壓力增加時,編譯程式會增加堆積配置中的頁面大小,以協助解決分散問題。 不過,如果您接近 32 位位址空間限制,建議您利用 x64 (64 位) 交叉編譯程式工具集。

在 Visual Studio 2013 中,我們也引進了 x64 交叉工具。 它包含 64 位的跨編譯程式/連結器,可針對 x86 和 arm 平台進行建置。 它也適用於Visual Studio 2012和舊版中提供的 x86 (32 位) 交叉工具組。 本文包含使用者如何使用 x64 (64 位) 交叉工具組的概觀。 如果您無法移至 Visual Studio 2013,您可以搭配 Visual Studio 2012 和舊版使用下列因應措施:

  • 如果您的應用程式是 x64 平台的目標,請使用 x64 工具集來建置您的應用程式。 您可以在 命令列上找到如何:啟用 64 位、x64 裝載 MSVC 工具組的指示。
  • 如果您目前正在 x86 作業系統上建置應用程式,請移至 x64 作業系統。 這會將可用的虛擬位址空間從 2 GB (GB) 為 4 GB。
  • 如果您目前正在 x86 操作系統上編譯,且無法移至 x64 作業系統,請使用 /3GB 啟動參數。 這會將可用的虛擬位址空間提升至 3 GB。

其他相關資訊

您可以在 '%Install Path%\Microsoft Visual Studio 12.0\VC\bin' 目錄中找到兩個 x64 型交叉工具組,如下圖所示。

[間隔] 視窗的螢幕快照,其中已醒目提示兩個 x64 型交叉工具組。

amd64_x86amd64_arm資料夾包含您必須使用 x64 交叉工具組為 x86 和 arm 目標建置的所有專案。

針對 MSBuild 使用者

如果您目前使用 MSBuild 作為建置程式的一部分,您可以利用稱為 PreferredToolArchitecture的新專案層級屬性。 此屬性可讓用戶選取要用來建置應用程式的工具集 (x86 或 x64) 。

當您搭配命令使用 /p:PreferredToolArchitecture=x64 argument 時,當您建置以 x64 平台為目標的應用程式時,會使用 x64 原生工具集 VC\bin\amd64 () ,而當您建置以 x86 平臺為目標的應用程式時,會使用 x64 跨工具組 (VC\bin\amd64_x86msbuild) 。

針對 Visual Studio IDE 使用者

Visual Studio 集成開發環境 (IDE) 不支援 x64 交叉工具。 我們將在未來解決此問題。 不過,下列因應措施應該可讓您利用Visual Studio IDE 中的 x64 交叉工具:

  1. 啟動 Visual Studio 2013 開發人員命令提示字元。 您可以在 Windows 開始畫面上找到開發人員命令提示字元,如下所示。

    在搜尋方塊中輸入開發人員,以尋找開發人員命令提示字元。

  2. 在開發人員命令提示字元中 PreferredToolArchitecture ,將屬性設定為指向您想要用來建置目標應用程式的工具集。

  3. 從開發人員命令提示字元啟動 Visual Studio (devenv) 。 您現在應該已準備好利用交叉工具。

    VS2013 [開發命令提示字元] 預覽視窗的螢幕快照。

    確認使用正確工具組的其中一個快速方式是建立並建置具有其他編譯程式旗標的 /Bt應用程式。 編 /Bt 譯程式旗標會顯示 C1、C1XX 和 C2 DLL 所花費時間的詳細資訊。 此外,它會提供使用哪一個工具組來建置目標應用程式的詳細數據。 旗 /Bt 標可以套用在專案屬性頁底下, (組態 屬性>C++>命令行) 。 在下圖中,請注意 (amd64_x86) 使用的工具組。

    螢幕快照顯示 MFCApplication3 屬性頁中的輸出和所有選項。