LNK2005 / LNK1169: operator new 重複定義とライブラリ競合の直し方

LNK2005 / LNK1169: operator new 重複定義とライブラリ競合の直し方

古いMFCプロジェクト(VS2010やVS2013時代でスタティックMFCリンクを使っていたもの)をVS2026で開いたとき、operator new の重複を示す LNK2005 が大量に出るケースがあります。
この記事では、原因となるリンク順序の問題を修正する手順をまとめています。

最初に確認する症状読む記事
スタティックMFCで、設定は合っているのにoperator newが重複するこの記事:ライブラリのリンク順序を確認
「MFC の使用」と/MT/MDが合わない、または外部.libのランタイムが異なるLIBCMTD.lib/nafxcw.libとランタイム設定の不一致

目次

エラーの原因切り分け:LNK2005 と LNK1169 の関係

エラー一覧に LNK2005LNK1169 が出ていたら、まず以下の状況であることを確認してください。

エラー番号現象原因
LNK2005operator newLIBCMTD.lib で定義済みリンク順序の逆転
CRTがMFCより先に読み込まれている
LNK1169多重定義されたシンボルが見つかりません上記の結果、全体の整合性が取れない

この問題は スタティックMFCリンク(プロジェクトプロパティ → 詳細 → MFCの使用 が「スタティックライブラリでMFCを使用する」)のプロジェクトで発生します。DLLでMFCを使うプロジェクトでは通常この問題は出ません。

スタティックMFCでは、MFCのライブラリをCRT(標準ライブラリ)より先にリンクしなければなりません。VS2026への変換時にこの順序設定がリセットされると、CRTが先に new を定義してしまい、後から来たMFC独自の new と衝突してエラーになります。


検証環境:Visual Studio 2026

以下の順番で設定を確認します。

手順1: 競合するライブラリを「無視」リストに追加する

リンカが自動で読み込んでいるライブラリのうち、順序が逆転しているものを「無視」リストに追加します。これにより、次の手順で指定する正しい順序の設定が優先されます。

  1. ソリューションエクスプローラーでプロジェクトを右クリックし、[プロパティ] を開きます。
  2. 左側のツリーから [構成プロパティ] > [リンカー] > [入力] を選択します。
  3. [特定の既定のライブラリの無視](Ignore Specific Default Libraries)の行を探します。
  4. 以下の値を入力します(セミコロン区切り)。

uafxcwd.lib;libcmtd.lib

※ 上記は Unicode Debug ビルドの場合です。構成によって以下のように変わります。エラーログに出ているライブラリ名に合わせてください。

構成無視するライブラリ
Unicode Debuguafxcwd.lib;libcmtd.lib
Unicode Releaseuafxcw.lib;libcmt.lib
MBCS Debugnafxcwd.lib;libcmtd.lib
MBCS Releasenafxcw.lib;libcmt.lib
Visual Studio 2026のリンカー入力で「特定の既定のライブラリの無視」の設定場所を示した画面

手順2: MFCライブラリを先頭に明示的に追加する

手順1で「無視」に指定したライブラリを、今度は手動で正しい順序(MFCが先)で登録します。

  1. 同じく [リンカー] > [入力] 画面を開いたままにします。
  2. [追加の依存ファイル](Additional Dependencies)の行を編集します。
  3. リストの先頭に以下の順序で記述します。

uafxcwd.lib;libcmtd.lib

必ず MFCのライブラリを先頭に書いてください。「MFCの new を優先する」という指示をリンカに伝えるための設定です。手順1で無視リストに追加したものと同じライブラリ名(構成に対応したもの)を使います。

Visual Studio 2026のリンカー入力で「追加の依存ファイル」の設定場所を示した画面

手順3: 設定を見直してもエラーが消えない場合

設定が正しいはずなのにエラーが残る場合は、古いビルドキャッシュが残っている可能性があります。

  1. プロジェクトを右クリック → [クリーン]
  2. エクスプローラーでプロジェクトフォルダを開き、.vs フォルダと生成された x64(または Debug / Release)フォルダを物理的に削除します。
  3. 再度 [リビルド] を実行します。

なお、LNK2005 はリンカーオプション /FORCE:MULTIPLE で強制的に通すこともできますが、重複したシンボルのどちらが使われるか保証されず、実行時のクラッシュや未定義動作を招きます。原因であるリンク順序を直すこの手順で解決してください。/FORCE はあくまで最終手段です。


再発防止チェックリスト

  • [ ] LNK2005 で operator new が出たらリンク順序を疑う
  • [ ] リンカー設定の「特定の既定のライブラリの無視」に競合ライブラリを追加したか
  • [ ] 「追加の依存ファイル」の先頭に MFCライブラリ(uafxcwd.lib)を記述したか
  • [ ] stdafx.h / pch.h の先頭で不要な windows.h を直接インクルードしていないか
目次