意味不明だったエラーのメモ
スタティックライブラリを作成するプロジェクトをソリューションに追加したところこんなんでました。
msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: __thiscall std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >::~basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >(void)" (??1?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@XZ) は既に hogehoge.obj で定義されています。
使用しているのは、VisualC++2008ExpressEdition
・解決方法
プロジェクトのプロパティ→C/C++→コード生成って入るとランタイムライブラリって設定項目がある。ここの内容が、メインで作っていたプログラムのプロジェクトの設定と、新しく追加した、スタティックライブラリのプロジェクトの設定が異なっていたことが原因のようだ。
ってなわけで、どっちかのプロジェクトの設定に統一してやれば問題無い。
俺の場合は、メインで作っていたのがマルチスレッドデバッグ(/MTd)だったのに対し、新しくソリューションに追加したプロジェクトはマルチスレッドデバッグDLL(/MDd)となっていた。
多分、マルチスレッドデバッグはDLLの方もそうでない方も、同じ関数群が定義されているが、読み込む対象としては別物なため、#pragma onceみたいな感じのものが働かず、両方読み込んでしまうために、すでに定義されてんぞごらって怒られるのかなw
そういえば、VC6.0のプロジェクトをVC2008のプロジェクトに変換すると、マルチスレッドデバッグが選択されているが、VC2008で新しく作成するとマルチスレッドデバッグDLLが選択されてるみたいだな。
マルチスレッドデバッグDLLにしておくと、共通して使われるdllが外部から読み込まれる形になるからファイルサイズが小さくなるのは嬉しいんだけど、VC2008が入ってないPCとかだと、使用するDLL考慮して持ってかないと動かないからめんどいってのがあるよなー