差分表示


#freeze
*&date(Y-n-j[lL],2016/9/3); opencvのコンパイル

opencvを使ってみたいけれど、公式配布のwin用バイナリは vs12,vs14 用 dll 版だけのようで個人的に好みでないのでソースをビルドしてみることに。

CMake を使う模様。てことで、慣れてない CMake 使用のメモ書き。~
※ CMake GUI 版でよければ[[こちら>http://www.buildinsider.net/small/opencv/003]]の記事で解説されている通りにやれば出来るのだけど、最終的には再生成用バッチを組みたいのでコマンドラインで作業。

~
バイナリ配布にもソース入っているけれど、別途[[ここ>https://github.com/opencv/opencv/releases/tag/3.1.0]]から Source code のみの opencv-3.1.0.zip をダウンロードして展開、\opencv-3.1.0フォルダとする。

CMakeでソース環境外でビルドするには、まずビルド用フォルダ用意して そこをカレントにする必要があるらしい。
 cd \opencv-3.1.0
 md build
 cd build

そして
 CMake -G "Visual Studio 12 2013 Win64" -DBUILD_SHARED_LIBS=0  ..\ 

とすれば vs12 x64用 staticライブラリ(/Mt)版の sln 環境が生成され、生成された OpenCV.sln でビルドすれば .lib 群の出来上がり、と。


引数の ..\ は、ソース環境の基準となるディレクトリ位置の指定。ソース外ビルドするときは必須。

オプション -G は生成するビルドシステム(コンパイラ) の指定。どういう指定があるかは CMake --helpで確認。vs9 x86用なら "Visual Studio 9 2008" な具合。(CMake の運用では x86用と x64用とで sln(vc(x)proj) を別々に生成するのが普通ってことのよう)

オプション -D でopencv固有の BUILD_SHARED_LIBS を off にすることで dll(shared)ライブラリを止める指定になる。(つまりデフォルトはshared)

opencvビルドオプションはイッパイあり、opencv-3.1.0/直下の CMakeLists.txt の中を覗けば 説明付きでずらっと並んでるのでそれらを確認。

~
前記では staticライブラリ(/Mt)な生成になったけれど、dllランタイム版(/Md)にする場合は BUILD_WITH_STATIC_CRT をoffにする
 CMake -G "Visual Studio 12 2013 Win64" -DBUILD_SHARED_LIBS=0 -DBUILD_WITH_STATIC_CRT=0 ..\ 

※ .lib .exeごとに vcxproj があって数が多いので、とても手作業で コンパイルオプションを設定し直す気になれないで、CMakeで生成し直しとなる。


~
また、うちの環境には Cuda sdkが入っていて、自動でcuda対応になってしまうのだけど非常にコンパイル時間が長くなってしまうため(数時間コース)、とりあえずcuda非対応にするために
 -DWITH_CUDA=0 -DWITH_CUFFT=0 -DBUILD_CUDA_STUBS=0

を加えたりもした。~
OpenCL対応も不要ならば
 -DWITH_OPENCL=0 -DWITH_OPENCL_SVM=0 -DWITH_OPENCLAMDFFT=0 -DWITH_OPENCLAMDBLAS=0

を付ければよい、のだけど、こちらについては付けなくても問題なさそうだった。

その他 sample\をビルドしたければ -DBUILD_EXAMPLES=1 付けたり、逆にテスト関係不要ならば -DBUILD_TESTS=0 -DBUILD_PERF_TESTS=0 を付けたり、このへんはお好みで。

~
あと生成された.sln(.vcxproj)の中で opencv_videoio….libのビルドではバッチ経由でCMakeを使う設定のようで、sln生成CMake 実行時と同じ場所に CMake.exe がないと不味いようだった。(作業途中で 32bit版 CMake から 64bit版にインストールし直したのがいけないのだけど^^;)


~
それと試した範囲では、vc10exp,vc12,vc14は問題なかったけれど vc11 は何故か CMake でエラー終了になってしまった。 

vc9(vc8) については、コンパイルできる.libも多いけれど、ソースで stdint.h が使われているライブラリもあってそれらがアウトだったり、OpenCL関係やvideoio関係がアウトなので、公式には未対応コンパイラの模様。~
代用のstdint.hを用意してvs側でincludeパスを通し、OpenCL関係もoffにすればかなりコンパイル通るようになるけれど、opencv_videoio 関係は失敗する状態。~
また vc8,vc9 に関してはIDE上でのコンパイルは試せるけれど msbuild を使ってのビルドは、msbuild.exeが即ハングするため駄目だった。
また vc8,vc9 に関してはIDE上でのコンパイルは試せるけれど msbuild を使ってのコマンドライン・ビルドは、msbuild.exeが即ハングするため駄目だった。


~
と、例によってlib生成だけでお腹いっぱいになってしまったので使用についてはまたそのうち。