毛のはえたようなもの

インターネット的なものをつらつらとかきつらねる。

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]対応のものを使用したのがよくなかったようだ。

本当はどう対処するべきだったのか

ランタイムライブラリをMD[d]のまま、

「プロパティ > 構成プロパティ > 全般 > MFCの使用」を「共有DLLでMFCを使う」にする。

警告がたんまり出ましたが動きました。わっほー。