MFC プロジェクトのリンク時に、operator new や operator delete などが already defined in LIBCMTD.lib(または nafxcw.lib)と出る LNK2005 は、まず「MFC の使用」設定とランタイム ライブラリ(/MT・/MD)の組み合わせ不一致を疑います。
error LNK2005: "void * __cdecl operator new(unsigned __int64)" は既に LIBCMTD.lib(new_scalar.obj) で定義されています。
fatal error LNK1169: 1 つ以上の多重定義シンボルが見つかりました。
| 最初に確認する症状 | 読む記事 |
|---|---|
「MFC の使用」と/MT・/MDが合わない、または外部.libのランタイムが異なる | この記事:2つの設定と外部ライブラリを確認 |
スタティックMFCで、設定は合っているのにoperator newが重複する | LNK2005/LNK1169とリンク順序の確認 |
まず確認:「MFC の使用」と「ランタイム ライブラリ」を合わせる
MFC のリンク方式(静的か共有 DLL か)と、CRT のリンク方式(静的 /MT か 動的 /MD か)は、必ずそろえる必要があります。ここがずれると、CRT と MFC の両方が new / delete を定義し、重複になります。
| 「MFC の使用」 | 合わせるランタイム ライブラリ |
|---|---|
| スタティック ライブラリで MFC を使用する | マルチスレッド (/MT) / マルチスレッド デバッグ (/MTd) |
| 共有 DLL で MFC を使用する | マルチスレッド DLL (/MD) / マルチスレッド デバッグ DLL (/MDd) |
エラーに出てくるライブラリ名は、どの CRT / MFC が取り込まれたかを示しています。名前から構成を逆算できます。
| ライブラリ名 | 正体 |
|---|---|
LIBCMT.lib / LIBCMTD.lib | 静的 CRT(/MT / /MTd) |
MSVCRT.lib / MSVCRTD.lib | 動的 CRT(/MD / /MDd) |
nafxcw.lib / nafxcwd.lib | 静的リンク MFC(MBCS。Release / Debug) |
uafxcw.lib / uafxcwd.lib | 静的リンク MFC(Unicode。Release / Debug) |
検証環境:Visual Studio 2026
手順1:プロジェクトの2つの設定を一致させる
まず自分のプロジェクト側を直します。2か所を見ます。
- プロジェクトのプロパティ → [詳細] → [MFC の使用] を確認します(静的か共有 DLL か)。
- プロパティ → [C/C++] → [コード生成] → [ランタイム ライブラリ] を、上の早見表に合わせて設定します。


注意点は 構成ごとに設定が分かれていることです。Debug / Release と x86 / x64 で別々に持つため、すべての構成で組み合わせが合っているか確認します。片方の構成だけ直して安心しないでください。
手順2:リンクしている外部 .lib のランタイムを疑う
自分のプロジェクト設定が正しいのにまだ出る場合は、リンクしている外部の静的ライブラリが、あなたのプロジェクトと違うランタイムでビルドされている可能性が高いです。
たとえば、あなたのアプリが 共有 DLL で MFC を使用(/MD)なのに、リンクする外部 .lib が /MT でビルドされていると、その .lib が LIBCMT.lib を持ち込み、あなたの MSVCRT.lib と new / delete が衝突します。
- ソースがあるなら、その外部ライブラリをあなたのプロジェクトと同じランタイム設定で再ビルドします。これが最も安全です。
- 提供元のバイナリしかないなら、対応するランタイムでビルドされた版を入手するか、提供元に確認します。
手順3:応急処置として /NODEFAULTLIB で競合 CRT を外す
外部ライブラリを再ビルドできず、すぐ通したいときだけの応急処置です。競合している側の CRT を1つに寄せます。
- プロパティ → [リンカー] → [入力] → [特定の既定のライブラリの無視] を開きます。
- エラーで「既に定義されています」と名指しされた側の CRT を1つだけ無視に追加します(例:
LIBCMTD.lib)。
この指定は、内部的にはリンカーの /NODEFAULTLIB:libcmtd オプションになります。どちらを残すかは、残したいランタイム側を生かすのが原則です(共有 DLL 構成なら MSVCRT(D).lib を残し、静的 CRT 側を無視する)。
注意:CRT を混在させたまま /NODEFAULTLIB で無理にリンクを通すと、リンクは成功しても実行時にヒープやグローバル状態の不整合を起こすことがあります。恒久対策は手順1・2(設定の一致と再ビルド)です。/NODEFAULTLIB は、原因を理解したうえでの一時しのぎと考えてください。
関連記事
- 同じ
LNK2005でも、静的 MFC でoperator newが重複し、リンク順序の逆転が原因のケース → LNK2005 / LNK1169: operator new 重複定義とライブラリ競合の直し方
まとめ
already defined in LIBCMTD.lib系のLNK2005は、まず「MFC の使用」と「ランタイム ライブラリ」の組み合わせを合わせる。- 静的 MFC ↔ /MT(d)、共有 DLL MFC ↔ /MD(d)。全構成で確認する。
- 設定が正しいのに出るなら、外部 .lib のランタイム違いを疑い、同じ設定で再ビルドする。
/NODEFAULTLIBは応急処置。混在のまま通すと実行時リスクが残る。
