2007年2月17日土曜日

プログラム開発でよくある失敗

Visual Studio 2003 (vc7.1)から、Visual Studio 2005 (vc8)に乗り換えました。

ただ、この2つで使われるマルチスレッドのライブラリのversionが違っていて、vc7.1でビルドしたマルチスレッドを使うライブラリ(dll)を実行時に使ってしまうと、原因とは脈絡もないところでメモリ関連のエラーが出てデバッグに苦しみます。

そういうときは、
> dumpbin /dependents (dllのファイル)
で調べます。
Dump of file xerces-c_2_7D.dll

File Type: DLL

Image has the following dependencies:

WS2_32.dll
ADVAPI32.dll
KERNEL32.dll
MSVCR80D.dll

MSVCR80D.dll が、MSVCR71D.dllなどになっていたら危険信号。結局、普段良く使っている、BerkeleyDBとか、Xerces-C++とかを再コンパイル。

その点BoostライブラリのWindows版はよくできていて、対応するコンパイラでビルドされたライブラリがない場合はちゃんとこのライブラリがない、と実行時に指摘してくれます。dllを動的に読み込んでるからこそできる技。

でも、こんなの慣れた開発者じゃないとわからないよなぁ。。。。C++の教科書読んだって書いてないもの。xercesだって、BerkeleyDBだって、vc7.1でbuildされたdllを注意書きもなくしれっと配布しているし。。。やれやれ。

0 件のコメント:

License

Creative Commons LicenseLeo's Chronicle by Taro L. Saito is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 2.1 Japan License.