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

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

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


目次

エラーの原因切り分け: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 プロパティ画面:リンカー入力の「追加の依存ファイル」の先頭にMFCライブラリを追加している様子

手順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> を消すのが一番安全です。


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

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

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

再発防止チェックリスト

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