古いMFCプロジェクト(VS2010やVS2013時代でスタティックMFCリンクを使っていたもの)をVS2026で開いたとき、operator new の重複を示す LNK2005 が大量に出るケースがあります。
この記事では、原因となるリンク順序の問題を修正する手順をまとめています。
エラーの原因切り分け:LNK2005 と LNK1169 の関係
エラー一覧に LNK2005 と LNK1169 が出ていたら、まず以下の状況であることを確認してください。
| エラー番号 | 現象 | 原因 |
| LNK2005 | operator new が LIBCMTD.lib で定義済み | リンク順序の逆転 CRTがMFCより先に読み込まれている |
| LNK1169 | 多重定義されたシンボルが見つかりません | 上記の結果、全体の整合性が取れない |
この問題は スタティックMFCリンク(プロジェクトプロパティ → 詳細 → MFCの使用 が「スタティックライブラリでMFCを使用する」)のプロジェクトで発生します。DLLでMFCを使うプロジェクトでは通常この問題は出ません。
スタティックMFCでは、MFCのライブラリをCRT(標準ライブラリ)より先にリンクしなければなりません。VS2026への変換時にこの順序設定がリセットされると、CRTが先に new を定義してしまい、後から来たMFC独自の new と衝突してエラーになります。
検証環境:Visual Studio 2026
以下の順番で設定を確認します。
手順1: 競合するライブラリを「無視」リストに追加する
リンカが自動で読み込んでいるライブラリのうち、順序が逆転しているものを「無視」リストに追加します。これにより、次の手順で指定する正しい順序の設定が優先されます。
- ソリューションエクスプローラーでプロジェクトを右クリックし、[プロパティ] を開きます。
- 左側のツリーから [構成プロパティ] > [リンカー] > [入力] を選択します。
- [特定の既定のライブラリの無視](Ignore Specific Default Libraries)の行を探します。
- 以下の値を入力します(セミコロン区切り)。
uafxcwd.lib;libcmtd.lib
※ 上記は Unicode Debug ビルドの場合です。構成によって以下のように変わります。エラーログに出ているライブラリ名に合わせてください。
| 構成 | 無視するライブラリ |
| Unicode Debug | uafxcwd.lib;libcmtd.lib |
| Unicode Release | uafxcw.lib;libcmt.lib |
| MBCS Debug | nafxcwd.lib;libcmtd.lib |
| MBCS Release | nafxcw.lib;libcmt.lib |

手順2: MFCライブラリを先頭に明示的に追加する
手順1で「無視」に指定したライブラリを、今度は手動で正しい順序(MFCが先)で登録します。
- 同じく [リンカー] > [入力] 画面を開いたままにします。
- [追加の依存ファイル](Additional Dependencies)の行を編集します。
- リストの先頭に以下の順序で記述します。
uafxcwd.lib;libcmtd.lib
必ず MFCのライブラリを先頭に書いてください。「MFCの new を優先する」という指示をリンカに伝えるための設定です。手順1で無視リストに追加したものと同じライブラリ名(構成に対応したもの)を使います。

手順3: ソースコードのインクルード順序を確認する
手順1・2を設定してもエラーが残る場合は、ソースコード側(プリコンパイル済みヘッダー)で <windows.h> を先に直接インクルードしていないか確認してください。
MFCを使うプロジェクトでは、通常は <afxwin.h> の内部で必要な Windows ヘッダーが適切な順序で取り込まれます。そのため、<windows.h> を自分で直接書く必要は基本的にありません。
stdafx.h(または pch.h)を開き、不要な <windows.h> を先頭で読んでいないか確認してください。
× NG(Windows ヘッダーを先に直接読む)
#include <windows.h> // 先に直接インクルードしている
#include <afxwin.h> // 後からMFCを読んでいる
〇 OK(基本形)
#include <afxwin.h> // 通常はこれだけで十分
どうしても <windows.h> を直接使う事情がある場合は、<afxwin.h> の後ろに置いてください。まずは不要な <windows.h> を消すのが一番安全です。
最終手段: 設定を見直してもエラーが消えない場合
設定が正しいはずなのにエラーが残る場合は、古いビルドキャッシュが残っている可能性があります。
- プロジェクトを右クリック → [クリーン]
- エクスプローラーでプロジェクトフォルダを開き、
.vsフォルダと生成されたx64(またはDebug/Release)フォルダを物理的に削除します。 - 再度 [リビルド] を実行します。
再発防止チェックリスト
- [ ] LNK2005 で
operator newが出たらリンク順序を疑う - [ ] リンカー設定の「特定の既定のライブラリの無視」に競合ライブラリを追加したか
- [ ] 「追加の依存ファイル」の先頭に MFCライブラリ(
uafxcwd.lib)を記述したか - [ ]
stdafx.h/pch.hの先頭で不要なwindows.hを直接インクルードしていないか
