次の方法で共有


リンカーの致命的なエラー: LNK1102: メモリ不足

x86 (32ビット) ツールセットを使用して大規模なプロジェクトをビルドする際にスローされるメモリ不足エラーを解決する方法をこの記事で紹介します。

元の製品バージョン: Visual Studio Professional 2010
元の KB 番号: 2891057

症状

x86 (32 ビット) ツール セット (Whole Program Optimization enabled) を使用して大規模なプロジェクトをビルドするとします。 これは、リンク時コード生成 (LTCG) を意味します。

このシナリオでは、リンカーは、ビルドエラーの原因となるメモリ不足 (OOM) の問題を報告する可能性があります。

原因

この問題は主に、LTCG 中にコンパイラが必要とするヒープ領域が多いために発生します。 通常、リンカーはディスク入出力 (I/O) バインドであり、コンパイラほど多くのメモリを使用しません。 ただし、リンカーは LTCG 中にコンパイラを呼び出します。

リンカーとコンパイラにはそれぞれ独自のヒープ管理スキームがあります。 アドレス空間の負荷が満たされたときに役立つ相互通信メカニズムはありません。 さらに、コンパイラのメモリ使用量が多く、頻繁に急増するため、アドレス空間に重大な断片化が発生し、少量のヒープ領域が要求されるとエラーが発生する可能性があります。

解決方法

Microsoft Visual Studio 2013 では、ヒープの割り当てが正常に行われず、コンパイラがリンカーに通信し、リンカーがマップされたファイルを解放することでヒープ領域を解放するメカニズムを導入しました。 また、メモリ不足がいつ増加するかを確認するメカニズムも実装しました。コンパイラは、断片化の問題に役立つヒープ割り当てのページ サイズを増やします。 ただし、32 ビットのアドレス空間制限に近づいている場合は、x64 (64 ビット) クロス コンパイラ ツール セットを利用することをお勧めします。

Visual Studio 2013 では、x64 クロス ツールも導入しました。 x86 および arm プラットフォーム用にビルドする 64 ビットのクロス コンパイラ/リンカーが含まれています。 また、Visual Studio 2012 以前のバージョンで使用できる x86 (32 ビット) クロス ツール セットにも対応しています。 この記事では、ユーザーが x64 (64 ビット) クロス ツール セットを使用する方法の概要について説明します。 Visual Studio 2013 に移行できない場合は、Visual Studio 2012 以前のバージョンで次の回避策を使用できます。

  • アプリケーションが x64 プラットフォームを対象としている場合は、x64 ツール セットを使用してアプリケーションをビルドします。 手順については、「 方法: コマンド ラインで 64 ビット x64 ホスト MSVC ツールセットを有効にする方法
  • 現在 x86 オペレーティング システムでアプリケーションをビルドしている場合は、x64 オペレーティング システムに移動します。 使用可能な仮想アドレス空間を 2 ギガバイト (GB) から 4 GB に引き上げます。
  • 現在 x86 オペレーティング システムでコンパイルしていて、x64 オペレーティング システムに移行できない場合は、 /3 GB スタートアップ スイッチを使用。 これにより、使用可能な仮想アドレス空間が 3 GB に引き上げられます。

詳細

次の図に示すように、2 つの x64 ベースのクロス ツール セットは、'%Install Path%\Microsoft Visual Studio 12.0\VC\bin' ディレクトリにあります。

2 つの x64 ベースのクロス ツール セットが強調表示されている bin ウィンドウのスクリーンショット。

amd64_x86フォルダーとamd64_arm フォルダーには、x64 クロス ツール セットを使用して x86 と arm ターゲット用にビルドする必要があるすべてのものが含まれています。

MSBuild ユーザーの場合

現在、ビルド プロセスの一部として MSBuild を使用している場合は、 PreferredToolArchitectureと呼ばれる新しいプロジェクト レベルのプロパティを利用できます。 このプロパティを使用すると、ユーザーはアプリケーションのビルドに使用するツール セット (x86 または x64) を選択できます。

/p:PreferredToolArchitecture=x64 argumentmsbuild コマンドと共に使用すると、x64 プラットフォームを対象とするアプリケーションをビルドするときに x64 ネイティブ ツール セット (VC\bin\amd64) が使用され、x86 プラットフォームをターゲットとするアプリケーションをビルドするときに x64 クロス ツール セット (VC\bin\amd64_x86) が使用されます。

Visual Studio IDE ユーザーの場合

x64 クロス ツールは、Visual Studio 統合開発環境 (IDE) ではすぐにサポートされていません。 今後対処する予定です。 ただし、次の回避策を使用すると、Visual Studio IDE で x64 クロス ツールを利用できます。

  1. Visual Studio 2013 開発者コマンド プロンプトを起動します。 次に示すように、Windows のスタート画面に開発者コマンド プロンプトが表示されます。

    検索ボックスに「developer」と入力して、開発者コマンド プロンプトを見つけます。

  2. 開発者コマンド プロンプトで、ターゲット アプリケーションのビルドに使用するツール セットを指す PreferredToolArchitecture プロパティを設定します。

  3. 開発者コマンド プロンプトから Visual Studio (devenv) を起動します。 これで、クロス ツールを利用する準備ができました。

    VS2013 プレビュー ウィンドウの開発コマンド プロンプトのスクリーンショット。

    適切なツール セットが使用されていることを確認する簡単な方法の 1 つは、追加のコンパイラ フラグが /Btされたアプリケーションを作成してビルドすることです。 /Bt コンパイラ フラグは、C1、C1XX、および C2 DLL で費やされた時間に関する詳細な情報を出力します。 さらに、ターゲット アプリケーションのビルドに使用されているツール セットの詳細も示します。 /Bt フラグは、プロジェクトのプロパティ ページ (Configuration Properties>C++>Command Line) の下に適用できます。 次の図では、使用されているツール セット (amd64_x86) に注目してください。

    MFCApplication3 プロパティ ページの出力とすべてのオプションを表示するスクリーンショット。