MinGWでOpenCVをビルドしてみた
公式で配布されているOpenCVはOpenCLに対応していないconfigって噂を聞いたので、せっかくだからビルドしてみた。しにそうになったので記録として残す。
Qtがなくても一部機能制限されるだけで動くからQtのビルドにチャレンジするのはやめよう(戒め)
環境、バージョン
バージョンはこんな感じ。
- Qt 5.10.0
- VTK 8.1.0
- OpenCV 3.4.0
- OpenCL 1.2 (AMD APP SDK 3.0.130.135)
- MinGW 7.1.0 (Pleiades All in One 4.7.0)
- MSYS 1.0.19 (Pleiades All in One 4.7.0)
- Python 2.7.14 (Anaconda3)
- Python 3.6.3 (Anaconda3)
今回はDLLとコンパイラの相性がひどくて大丈夫な組み合わせを探すのに時間がかかった。
こんな感じで。
- Qt付属のMinGW ⇒ Qt OK、Python NG
- PleiadesのMinGW ⇒ Qt NG、Python OK
- ビルド済みTBB、AnacondaのQt ⇒ MSVCマングルなのでそもそもリンクできず
- Pythonからimport cv2 ⇒ OpenCVのhighguiがQtを使っているとなぜかダメ
結論として以下の組み合わせになった。
エラーへの対処方法
ビルド中に遭遇したエラー対処内容は以下の通り。
VTKのlibtiff
どうやらWindowsだと強制的にmsvcルートへ進むみたいでここ*3に書かれているようにThirdParty/tiff/vtktiff/CMakeLists.txtの「if(UNIX)」を「if(UNIX OR MINGW)」に修正するとビルドできる。
ちなみにVTKはQtやTBBを使うことができるらしい。今回は有効化していない。
たぶんTBBは自力でビルドするのは難しそう。しかもOpenCVがビルドしてくれるTBBは関数名を独自の命名規則に変更しているみたいなので流用はたぶん無理。
DirectShowのソースでコンパイルエラー
Pythonモジュールのコンパイルでエラー
std::hypotが見つからずコンパイルエラーになる。詳細を絞り込んでいないがヘッダとかdefineの組み合わせで発生する模様。MinGWでOpenCVをincludeしたPythonモジュールをコンパイルしようとすると出ちゃうっぽい。
出てしまった場合、
Pythonモジュールその2
Pythonモジュールのリンクでエラーになる。こちら*6の「undefined reference to __imp_Py_InitModule4」箇所を参照。
Python2、Python3のpyconfig.hの「MS_WIN64」のdefineを「_MSC_VER」の外側へ移動させる。
自分の環境だと以下のファイル。2.x系、3.x系ともにincludeフォルダに該当ヘッダファイルが入っているっぽい。
- D:\soft\Anaconda3\envs\py2714\include\pyconfig.h
- D:\soft\Anaconda3\include\pyconfig.h
こんな感じでなんとかビルドできた。動作確認は明日にしよう。
*1:https://docs.opencv.org/3.0-beta/doc/tutorials/introduction/windows_install/windows_install.html
*2:https://qiita.com/YutaYANAGITYAYA/items/545679c9fcf010056d57
*3:https://gitlab.kitware.com/vtk/vtk/issues/16999#note_292574
*4:https://stackoverflow.com/questions/44913299/opencv-build-from-source-windows-make-error-rc-object
*5:http://answers.opencv.org/question/62580/not-able-to-build-opencv3-rc1-with-debug-build-type/
*6:http://fx-kirin.com/python/windows-python-mingw64-environment-build/