よくあるlicmtd.libの多重宣言エラーに再びひっかかる
nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) はすでに LIBCMTD.lib(dbgnew.obj) で定義されています
この種のエラーはVisualC++を使っていると避けられないのでは?と思うくらいよく出てきます。私だけかもしれませんが。(矛盾)
久々にこのエラーを見たので当時どうクリアしたかすっかり忘れていたのでだいぶ苦労しましたが思い出したのでメモしておきます。
ランタイムライブラリ、とはプログラムを実行する上で必要になるライブラリです。Windowsの場合はご存知(?)のとおり静的ライブラリ(*.lib)と動的ライブラリ(*.dll)があります。
で、このランタイムライブラリは両方とも同じ関数が宣言されています。(リンクの仕方が違うだけ)なので、両方ともリンクしてしまうと、コンパイラさんが、どっちの宣言を利用して関数を実行すべきかわからずオロオロしてしまいます。上記のエラーはdelete[]って関数の宣言が二つあるんだけどどっち使えばいいのさ!?っていう悲鳴なわけですw
で、あるプロジェクトを作る場合、どちらを選ぶかはプロジェクトのプロパティから
[構成プロパティ]-[C/C++]-[コード生成]-[ランタイム ライブラリ]
で[MTD],[MDD],[MT],[MD]のいずれかを選びます。MTのほうは静的ライブラリに、MDのほうは動的ライブラリにリンクします。三つ目のDはデバッグ、の意味。
で、どちらを選ぶべきか…という話なのですが。
経験上、MFCのWindowsプログラミングをする場合はMTを、逆にコマンドラインベースのプログラミングをする場合はMDを選択すると、エラーがでないようです。MFCのほうは静的リンクを、コマンドラインベースの場合は動的リンクをしているからのようですね。
この場合、もうひとつ修正する必要があり[構成プロパティ]-[全般]-[MFCの利用]で
MFCの場合は、「スタティック ライブラリで MFC を使用する」を、 コマンドラインベースの場合は「共有 DLL で MFC を使う」を
することで上記のエラーが回避できるようです。
正直リンクエラーの回避は難しいですね。ランタイムエラーの次に難しいと思います。(勝手な思い込み)
よく回避方法としてlibcmtd.libを無視する、なんて方法が挙げられていますが、私の場合はそれでうまくいかなかったので上の方法で試してみました。
もし、同じような状況に陥った場合は試してみてくださいな。
P.S.
あと、上記の解釈が間違ってたりうそだったりする可能性もあります。そのときはコメントいただけると助かります。