LNK2005 / LNK1169 の直し方:operator new の重複定義とリンク順序を直す手順

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

古い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が消えれば一緒に消えます。

エラー番号現象原因
LNK2005operator 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のライブラリを「無視」リストに追加します。これにより、次の手順で指定する正しい順序の設定が優先されます。

  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と対になっていて、「無視」に指定した2つのライブラリを、今度は自分で正しい順序(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. 再度 [リビルド] を実行します。

クリーンしても残るときは、エラー一覧に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を直接インクルードしていないか
目次