古いMFCプロジェクト(VS2010やVS2013時代でスタティックMFCリンクを使っていたもの)をVS2026で開いたとき、operator newの重複を示すLNK2005が大量に出るケースがあります。
数が多いと、リンカーの /FORCE:MULTIPLEで通してしまいたくなりますが、重複したnewのどちらが使われるかは保証されません。原因はライブラリのリンク順序なので、その順序を設定で直します。
| 最初に確認する症状 | 読む記事 |
|---|---|
| スタティックMFCで、設定は合っているのにoperator newが重複する | この記事:ライブラリのリンク順序を確認 |
| 「MFCの使用」と/MT・/MDが合わない、または外部.libのランタイムが異なる | LIBCMTD.lib/nafxcw.libとランタイム設定の不一致 |
エラーの原因切り分け:LNK2005とLNK1169の関係
たいてい、LNK2005は何行も並び、最後にLNK1169が1行出てリンクが止まります。LNK1169はLNK2005の結果として出るので、LNK2005が消えれば一緒に消えます。
| エラー番号 | 現象 | 原因 |
| 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: 競合するライブラリを「無視」リストに追加する
リンカが自動で読み込むライブラリのうち2つ、MFCのライブラリとCRTのライブラリを「無視」リストに追加します。これにより、次の手順で指定する正しい順序の設定が優先されます。
- ソリューションエクスプローラーでプロジェクトを右クリックし、[プロパティ] を開きます。
- 左側のツリーから [構成プロパティ] > [リンカー] > [入力] を選択します。
- [特定の既定のライブラリの無視](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と対になっていて、「無視」に指定した2つのライブラリを、今度は自分で正しい順序(MFCが先)に並べて登録します。
- 同じく [リンカー] > [入力] 画面を開いたままにします。
- [追加の依存ファイル](Additional Dependencies)の行を編集します。
- リストの先頭に以下の順序で記述します。
uafxcwd.lib;libcmtd.lib
必ずMFCのライブラリを先頭に書いてください。「MFCのnewを優先する」という指示をリンカに伝えるための設定です。手順1で無視リストに追加したものと同じライブラリ名(構成に対応したもの)を使います。

手順3: 設定を見直してもエラーが消えない場合
設定が正しいはずなのにエラーが残る場合は、古いビルドキャッシュが残っている可能性があります。
- プロジェクトを右クリック → [クリーン]
- エクスプローラーでプロジェクトフォルダを開き、.vsフォルダと生成されたx64(またはDebug / Release)フォルダを物理的に削除します。
- 再度 [リビルド] を実行します。
クリーンしても残るときは、エラー一覧にLNK2038の「’RuntimeLibrary’ の不一致が検出されました」が一緒に出ていないかも見てください。出ているなら、リンクしている .libと自分のプロジェクトで、ランタイム ライブラリの設定(/MT・/MDやDebug・Releaseの別)が食い違っています。これはリンク順序を直しても消えません。エラー行に並ぶ2つの値の読み方と、どちらに揃えるかの決め方はLNK2038:RuntimeLibraryを /MDと /MTのどちらに揃えるかに書いています。
なお、LNK2005はリンカーオプション /FORCE:MULTIPLEで強制的に通すこともできますが、重複したシンボルのどちらが使われるか保証されず、実行時のクラッシュや未定義動作を招きます。原因であるリンク順序を直すこの手順で解決してください。/FORCEはあくまで最終手段です。
再発防止チェックリスト
- [ ] LNK2005でoperator newが出たらリンク順序を疑う
- [ ] リンカー設定の「特定の既定のライブラリの無視」に競合ライブラリを追加したか
- [ ] 「追加の依存ファイル」の先頭にMFCライブラリ(uafxcwd.lib)を記述したか
- [ ] stdafx.h / pch.hの先頭で不要なwindows.hを直接インクルードしていないか
