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

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

古いプロジェクト(VS2010やVS2013時代)をVS2026で開くと、出力ウィンドウを埋め尽くす大量のリンクエラーが出ることがあります。

特に、operator new_DllMain が重複しているという LNK2005 エラーは、MFCとCランタイム(CRT)の「どちらが先に場所を取るか」という、古くからある「椅子の奪い合い」が原因です。

この記事では、そんな歴史的な規律問題を解決し、気持ちよくビルドを通すための手順をまとめました。

エラーの原因切り分け:なぜ重複するのか?

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

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

本来、MFCアプリには「MFCのライブラリをCRT(標準ライブラリ)より先にリンクしなければならない」という鉄の掟があります。

VS2026への変換時にこの順序設定がリセットされると、CRTが先に new を定義してしまい、後から来たMFC独自の new と衝突してエラーになります。


検証環境:Visual Studio 2026

以下、この順番で設定を強制的に上書きしていきます。

手順1: 競合するライブラリを一度「無視」する (所要時間: 2分)

まずは、リンカが勝手に読み込んでいる(順序が間違っている)ライブラリを「無視」リストに放り込みます。

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

uafxcwd.lib;libcmtd.lib

注意

古い設定(マルチバイト/MBCS)の場合は、nafxcwd.lib;libcmtd.lib になります。エラーログに出ているライブラリ名に合わせてください。

Visual Studio 2026 プロパティ画面:リンカー入力の「特定の既定のライブラリの無視」にライブラリ名を入力している様子

手順2: 正しい順序で「追加」し直す (所要時間: 1分)

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

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

uafxcwd.lib;libcmtd.lib

ここが最大のポイントです。必ず MFCのライブラリ(uafxcwd/nafxcwd)を先頭 に書いてください。これで「MFCの new を優先しろ」とリンカに命令できます。

Visual Studio 2026 プロパティ画面:リンカー入力の「追加の依存ファイル」の先頭にMFCライブラリを追加している様子

手順3: ソースコードのインクルード順序を確認 (所要時間: 3分)

上記の設定でも直らない場合、ソースコード側(特にプリコンパイル済みヘッダー)でCRTを先に呼んでしまっている可能性があります。

stdafx.h(または pch.h)を開き、インクルード順序を確認してください。

× ダメな例(CRTが先)

#include <windows.h>  // CRT設定が先に読み込まれてしまう
#include <afxwin.h>   // ここでMFCを読んでも手遅れ

〇 正しい例(MFCが先)

#include <afxwin.h>   // MFCが先にリンク指示を出す
#include <windows.h>

#include <afx...> がファイルの最上部にあることが重要です。


最終手段: どうしても解決しない場合

設定は完璧なはずなのにエラーが消えない場合は、古いビルド情報が悪さをしている可能性があります。

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

まとめ: 再発防止チェックリスト

最後に、次回の自分のためにこれだけは確認しておきましょう。

  • [ ] エラー LNK2005 で operator new が出たら「リンク順序」を疑う
  • [ ] リンカー設定の「無視するライブラリ」に競合ライブラリを入れたか?
  • [ ] 「追加の依存ファイル」の先頭に MFCライブラリ (uafxcwd.lib) を記述したか?
  • [ ] stdafx.hafxwin.hwindows.h より先にあるか?

MFCのビルドエラーは、コードのバグではなく「環境設定のパズル」であることが大半です。焦らず構成プロパティを確認して、パズルを解いていきましょう。