MFCで発生するリンクエラー error LNK2005 はライブラリの読み込み順が原因

リンクエラーが発生しました。
こんな感じでした ↓
リンクしています...
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) は既に LIBCMT.lib(new.obj) で定義されています。
nafxcw.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) は既に LIBCMT.lib(delete.obj) で定義されています。
nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) は既に LIBCMT.lib(new2.obj) で定義されています。
nafxcw.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z) は既に LIBCMT.lib(delete2.obj) で定義されています。
Release/xxx.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。


そこで、Webを検索してみると、frog.raindrop.jpの記事(error LNK2005) が見つかりました。

マイクロソフトのサポートサイト [PRB] C ランタイム ライブラリを MFC ライブラリより先にリンクしたときの LNK2005 エラー でも対処方の解説がされています。

MFCのプログラムで必ず最初にインクルードする stdafx.h では、最初に afxwin.h をインクルードし、さらにその中で afx.h がインクルードされています。
この afx.h が、ライブラリモジュール読み込み用の プラグマ を使用して、ライブラリの読み込み順を制御しています。

そのため、MFCのプログラム中で、 stdafx.h を最初にインクルードしないソースファイルがあると、このリンクエラーが発生するようです。

解決方法は、そのソースファイルに stdafx.h をインクルードするか、frog.raindrop.jpの記事(error LNK2005) で解説されているように、

... 解決策として、プロジェクトの設定でリンクの「無視するライブラリ」に Nafxcwd.lib と Libcmtd.lib を追加し(区切りはスペースでもカンマでもいいみたい)、「オブジェクト/ライブラリ モジュール」の方で、あらためて Nafxcwd.lib と Libcmtd.lib の順で指定したら、その順にリンクされるからうまくいく、と書いてある。

実はこれには補足があって、Nafxcwd.lib とLibcmtd.lib はともにデバッグ用のライブラリである。なので、Release でエラーが出る場合には、それぞれ Nafxcw.lib, Libcmt.lib に読み替えて設定する ...


とするかどちらか。

今回は、後者の方法でリンクエラーが解決しました (^^)
ありがたや、ありがたや。
[PR]
by isoq | 2006-04-20 17:54 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇
<< 新幹線 0.1 を 10回足しても 1... >>