OpenCVとMFCを使う時の注意点
Microsoft Visual Studio2005において、OpenCVの顔検出を使っていて、いつの時から「ヒープが壊れている」と言われて落ちるようになった。
落ちている個所はdetectMultiScale関数だったので、OpenCVのバグを疑ったが、そうではなかった。
MFCを使う時の基本的なミスらしい。悔しい、悔しい。。。
経緯と原因
OpenCVを使っていて、ある必要があって下記の一行を追加した。
#include <afxwin.h>
この一行を追加するとコンパイルエラー。出力には下記のように表示された。
fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]
というわけで、プロジェクトの「プロパティ > 構成プロパティ > C/C++ > コード生成 > ランタイムライブラリ」を /MT[d]に変更した。
この設定をしたときに「ヒープが壊れていることが原因として考えられます。」とランタイムエラーが出るようになった。
なぜ起こったか
OpenCVは動的リンクしていたのに、MFCのライブラリを静的リンクしようとして、不整合が起こったというのが正しそう。
OpenCVのランタイムライブラリはMD[d]対応のものを使用していたのに、MFCランタイムライブラリをMT[d]対応のものを使用したのがよくなかったようだ。