読者です 読者をやめる 読者になる 読者になる

虚苦心観察ブログ

ブログ管理者である虚苦心が私利私欲に基づいて書いているブログです。主にガジェットのレビューだったり、画像処理のことだったりを記事にしています。

CMake + OpenCV "3.0" + Visual Studio

OpenCV3.0をVisualStudioで使おうとするとこんなエラーが出ます。

error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in main.obj

これはビルド済みのOpenCVが使っているライブラリとビルドしようとしているプログラムのライブラリが同じ必要があるのに違うために起こっているようです。

これはVisualStudioのプロジェクトの設定から「C/C++」→「コード生成」と移動し、「ランタイムライブラリ」の項目をMT→MDに変更すればコンパイルでき、実行可能です。

ただCMakeを使っている場合はCMakeLists.txtを変更するたびにこの変更が毎回元に戻ってしまうので面倒です。
なのでCMakeにMD→MTに変更するための設定を追記します。

stackoverflow.com

重要なのはこちら
set(CompilerFlags
CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_RELEASE
CMAKE_C_FLAGS
CMAKE_C_FLAGS_DEBUG
CMAKE_C_FLAGS_RELEASE
)
foreach(CompilerFlag ${CompilerFlags})
string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
endforeach()

これを書くことで設定中に存在しているMDをすべてMTに変更してくれます。
めでたしめでたし