■ MSVCR80.dllがみつからない
先日の、VC2005でコンパイルしたexeが他の環境でDLLがみつからなくて動作しない件について、erakanさんからコメントを頂いた。
erakan 『初めまして。VCの[構成プロパティ]-[C/C++]-[コード生成]-[ランタイムライブラリ]を、
マルチスレッドDLL(/MD)からマルチスレッド(/MT)にすればいけるかも。』
こちらでも試行錯誤している過程でランタイムライブラリの設定を/MTにするのは一応試してはみたものの、
1>リンクしています...
1>msvcrt.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) は既に LIBCMT.lib(typinfo.obj) で定義されています。
1>msvcrt.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) は既に LIBCMT.lib(typinfo.obj) で定義されています。
1>msvcrt.lib(MSVCR80.dll) : error LNK2005: _exit は既に LIBCMT.lib(crt0dat.obj) で定義されています。
1>msvcrt.lib(MSVCR80.dll) : error LNK2005: _fprintf は既に LIBCMT.lib(fprintf.obj) で定義されています。
1>msvcrt.lib(MSVCR80.dll) : error LNK2005: _fopen は既に LIBCMT.lib(fopen.obj) で定義されています。
1>msvcrt.lib(MSVCR80.dll) : error LNK2005: _fclose は既に LIBCMT.lib(fclose.obj) で定義されています。
1>msvcrt.lib(MSVCR80.dll) : error LNK2005: _isspace は既に LIBCMT.lib(_ctype.obj) で定義されています。
1>LIBCMT.lib(crt0init.obj) : warning LNK4098: defaultlib 'msvcrt.lib' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
1>C:\Documents and Settings\n\My Documents\Visual Studio 2005\Projects\RimoTest\Release\RimoTest.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
のようなエラーが出てしまってリンクに失敗してしまった。MSVCR80.dllとLIBCMT.libが競合している?
この状態でMSVCR80.dllを使わないように設定できないか試してみたけれど、うまくいかず。しばらくはあまり時間が取れそうにないので、詳しい検証はまた後日に・・・。
あと、今日の仕事中に他のプログラマの人が作った変換ツールがコンパイルした人の環境では正常に動作するのに、自分の環境では「MSVCR80.dllがありません」というエラーが出て動かないという現象に遭遇した。
製作者に問い合わせてみると「先日VC2005のサービスパックを入れたので、もしかしたらそれが原因かも」とのこと。実際、VCをサービスパックごとアンインストールしてもう一度入れなおしてからコンパイルしたexeは、正常に動作するようになった。
もしかしたら、サービスパックを入れるとさらにMSVCR80.dllのバージョンが上がってしまっていたりするのかも?よくわからない。ややこしくて困る。
追記:
どうやら今回の件は、Wiiリモコンを使うためにリンクしているライブラリが古いMSVCR80.dllに依存しているのがのが原因で、/MTにすると競合してリンクが通らなくなるみたい。
■ VC 2005のランタイムDLLをEXEに同梱する
■ VC 2005 Express Editionで作成したアプリケーションを別の環境で動かすには
どうしてもダメそうなら、この辺を試してみようか・・・。
■ Dependency Walker (depends.exe) の使用方法
DLLの依存関係をチェックできるツール。便利。