takminの書きっぱなし備忘録 @はてなブログ

主にコンピュータビジョンなど技術について、たまに自分自身のことや思いついたことなど

OpenCVを使用している環境上へGoogle Testをインストール

OpenCVを使用している環境上へGoogle Testをインストールするのに結構はまったので、自分用のメモとして残しておきます。(なので、相変わらずやっつけで書いてます。)
(2011/09/23追記 以下の記事はGoogle TestおよびOpenCVを共に静的ライブラリ形式で作成した場合のものです。両ライブラリをDLL環境で構築しなおしたところ、ランタイムライブラリの変更を行う必要もなく、すんなりといきました。)


使用した開発環境は以下のとおりです。

  • Windows 7
  • Visual C++ 2010 Express Edition
  • OpenCV2.3 (SVN版 Rev.5850)
  • gtest1.6.0


おおまかに以下の流れでインストール作業を行いました。

  1. OpenCVのダウンロード&コンパイル
  2. gtestのダウンロード&コンパイル

OpenCVとgtestはここでは、DLLではなくスタティックライブラリとしてコンパイルします。DLLとスタティックライブラリの混在環境ではうまく動作しません。

OpenCVのインストール

OpenCVのインストールは、CMakeを使用してVC++のプロジェクトを作成後、コンパイルを行います。
ダウンロードとコンパイルについては、従来のものとほとんど手順は同じです。ここでは細かく説明しないので、以下のURLを参照してください。
http://d.hatena.ne.jp/takmin/20091211/1260545746
http://d.hatena.ne.jp/takmin/20100101/1262337781
http://imagingsolution.net/program/opencv/opencv2-3/opencv2-3-downlaod-install/


この際、CMakeの"BUILD_SHARED_LIBS"のチェックを外し、DLLではなくスタティックライブラリで作成します。

gtestのインストール

gtestは以下からダウンロードできます。
http://code.google.com/p/googletest/

ここでは、gtest-1.6.0.zipをダウンロードして解凍しました。


次にCMakeを起動して、ビルド環境を構築します。gtestの解凍先がCドライブ直下、ビルド環境の構築先がその下に作成したbuildフォルダとすると、
Were is the source code:

  • C:/gtest-1.6.0

Where to build the binaries:

  • C/gtest-1.6.0/build

として、configureボタンを赤い項目が消えるまで押し、次にgenerateボタンを押すことでビルド環境を構築します。


ビルド環境が構築できたら、VC++開いてリリース版とデバッグ版をそれぞれビルドします。
この時、gtestおよびgtest_mainのプロパティを開き、「構成プロパティ」→「C/C++」→「コード生成」の「ランタイムライブラリ」をそれぞれ、「マルチスレッドDLL(/MD)」および「マルチスレッド デバッグDLL(/MDd)」に変更します。(OpenCVと合わせます)

これで、gtestのlibファイルがそれぞれ"C:\gtest-1.6.0\build\Release"と"C:\gtest-1.6.0\build\Debug"フォルダ下に作成されます。

開発プロジェクトの構築

次に自分自身のプログラム開発のための環境を作成します。
VC++でプロジェクトを新規作成し(ここではコンソールアプリケーション)、プロジェクトのプロパティを開いて、以下の設定をすれば完了です。
以下ではOpenCVのビルドを"C:\OpenCV2.3"ディレクトリで行った場合です。「追加の依存ファイル」については、作成したいアプリケーションに合わせて適切なOpenCVのモジュールを選択してください。

  • デバッグ
    • 「構成プロパティ」→「C/C++」→「全般」→「追加のインクルードディレクトリ」
      • C:\OpenCV2.3\install\include\opencv
      • C:\OpenCV2.3\install\include
      • C:\gtest-1.6.0\include
    • 「構成プロパティ」→「C/C++」→「コード生成」→「ランタイムライブラリ」
    • 「構成プロパティ」→「リンカー」→「全般」→「追加のライブラリディレクトリ」
      • C:\OpenCV2.3\3rdparty\lib\Debug
      • C:\OpenCV2.3\lib\Debug
      • C:\gtest-1.6.0\build\Debug
    • 「構成プロパティ」→「リンカー」→「入力」→「追加の依存ファイル」
      • opencv_core230d.lib
      • opencv_imgproc230d.lib
      • opencv_highgui230d.lib
      • libjasperd.lib
      • libjpegd.lib
      • libpngd.lib
      • libtiffd.lib
      • zlibd.lib
      • gtest.lib
      • gtest_main.lib
  • リリース
    • 「構成プロパティ」→「C/C++」→「全般」→「追加のインクルードディレクトリ」
      • C:\OpenCV2.3\install\include\opencv
      • C:\OpenCV2.3\install\include
      • C:\gtest-1.6.0\include
    • 「構成プロパティ」→「C/C++」→「コード生成」→「ランタイムライブラリ」
      • 「マルチスレッドDLL(/MD)」
    • 「構成プロパティ」→「リンカー」→「全般」→「追加のライブラリディレクトリ」
      • C:\OpenCV2.3\3rdparty\lib\Release
      • C:\OpenCV2.3\lib\Release
      • C:\gtest-1.6.0\build\Release
    • 「構成プロパティ」→「リンカー」→「入力」→「追加の依存ファイル」
      • opencv_core230.lib
      • opencv_imgproc230.lib
      • opencv_highgui230.lib
      • libjasper.lib
      • libjpeg.lib
      • libpng.lib
      • libtiff.lib
      • zlib.lib
      • gtest.lib
      • gtest_main.lib


ちなみに、私はgtestビルド時にランタイムライブラリ変更を行わなかったために以下のようなエラーに悩まされました。

1>msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: __thiscall std::_Container_base12::~_Container_base12(void)" (??1_Container_base12@std@@QAE@XZ) は既に featureEvaluation.obj で定義されています。
1>msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: __thiscall std::_Container_base12::_Container_base12(void)" (??0_Container_base12@std@@QAE@XZ) は既に featureEvaluation.obj で定義されています。
1>msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: void __thiscall std::_Container_base12::_Orphan_all(void)" (?_Orphan_all@_Container_base12@std@@QAEXXZ) は既に featureEvaluation.obj で定義されています。
1>msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "void __cdecl std::_Xout_of_range(char const *)" (?_Xout_of_range@std@@YAXPBD@Z) は既に libcpmtd.lib(xthrow.obj) で定義されています。
(のようなエラーメッセージが延々と続く。。。)