2012/06/01 0:17 opencvのくだりを少し編集
およそ1年半ぶりにお好み焼きを作ってみたら、お好み焼きのような何かができてしまいました。そんなことにもめげず、OpenCVとfreeglutを使ったプロジェクトをWin32でもx64でもビルドできるようにします。
環境
OS Windows 7 Ultimate SP1 64bit
IDE Visual Studio 2010 Professional
OpenCVの導入
OpenCV 2.3.1をダウンロード(※今なら2.4.0でも良いかも)
http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.3.1/OpenCV-2.3.1-win-superpack.exe/download
展開したフォルダはopencvにリネーム。
便宜的にドライブ直下にopencv2.3.1というディレクトリを作成。その中に
opencv\3rdparty
opencv\build\include
opencv\build\x86\vc10\bin
opencv\build\x86\vc10\lib
の4つのディレクトリをディレクトリごとopencv2.3.1の下にコピー。つまり
C:\
- opencv2.3.1
-3rdparty
-bin
-include
-lib
という構成になる。
さらに、opencv2.3.1の下にx64というディレクトリを作成し、opencv\build\x64\vc10以下のディレクトリを全てコピー。つまり
C:\
- opencv2.3.1
-3rdparty
-bin
-include
-lib
-x64
-bin
-lib
という構成になる。
ここで通常なら環境変数にパスを通しますが、あえて通さないでおきます。(詳細は後述)
freegultの導入
GLUT(ジー・エル・ユー・ティー)はOpenGL向けユーティリティライブラリでしたが、なぜか開発が止まり、今は代わりにfreeglutというライブラリがあるので、こちらを使います。僕はウィンドウ全体をキャプチャするために必要だったので導入しました。
freegult-2.8.0をダウンロード
http://freeglut.sourceforge.net/
C直下に展開。つまり
C:\
- freeglut-2.8.0
という構成になる。
win32でもx64でも.exeが動くようにする
C:\freeglut-2.8.0\VisualStudio\2010\freeglut.slnを開いてバッチビルド。Releaseのwin32とx64にチェックを入れてビルド。
C:\freeglut-2.8.0\lib\x86\freeglut.dll
を
C:\Windows\SysWOW64
にコピー。
C:\freeglut-2.8.0\lib\x64\freeglut.dll
を
C:\Windows\System32
にコピー。
先ほどパスを通さなかったですが、環境変数にOpenCVのbinへのパスを追加する代わりに、opencvの.dllファイルをfreeglut.dllと同じようにぶちこみます。
C:\opencv2.3.1\bin以下の.dllファイルすべて
を
C:\Windows\SysWOW64
にコピー。
C:\opencv\x64\bin以下の.dllファイルすべてを
を
C:\Windows\System32
にコピー。
TBBの導入
OpenCVの並列処理のためにTBBが必要なのでこれをダウンロード。http://threadingbuildingblocks.org
5月30日現在、最新の安定版は tbb40_20120408oss
展開したら
F:\tbb40_20120408oss\bin\ia32\vc10 の中にある.dllを全部
C:\Windows\SysWOW64 にコピー。
F:\tbb40_20120408oss\bin\intel64\vc10 の中にある.dllを全部
C:\Windows\System32 にコピー。
Visual Studioの設定
Visual Studioを起動。プロジェクトを開く。
プロジェクト->プロパティ
構成プロパティ->C/C++->全般
追加のインクルードディレクトリに
C:\freeglut-2.8.0\include
C:\opencv2.3.1\include\opencv
C:\opencv2.3.1\include
を追記。
構成プロパティ->リンカー->全般
プラットフォームをWin32にして、追加のライブラリディレクトリに
C:\freeglut-2.8.0\lib\x86
を追記。プラットフォームをx64にして、追加のライブラリディレクトリに
C:\freeeglut-2.8.0\lib\x64
を追記。
さらにx64のままにして
構成プロパティ->C/C++->プリプロセッサ
プリプロセッサの定義の欄に
_WIN64
を追加。
ソースコード中では、プログラムで使用するライブラリ(.libファイル)をpragma文で指示。
(ifdefでwin32とx64でリンクさせるライブラリを変えるのがよい)
これでwin32でもx64でもビルドが通る環境が整いました。
トラブルシューティング
ビルドは通るけど「アプリケーションを正しく起動できませんでした(0xc000007b)」のウィンドウが出る
includeしている.libファイルと.dllのターゲットプラットフォームが一致していない。win32アプリとしてビルドするときはlibもdllもx86、x64アプリとしてビルドするときはlibもdllもx64でビルドする。SysWOW64ディレクトリとSystem32ディレクトリに適切なdllが格納されているか要確認。
