3.2.0がリリースされてすぐにビルドしようとして失敗して、しばらく放置していたのですが、気が向いて再トライしました。今のところ二つ解決方法を見つけたので、書いておきます。
まとめ
- macOSだと(おそらく)システムのOpenBLAS (
/opt/OpenBLAS
) を使う設定になっていると思うので、brew でいれた OpenBLAS1 (/usr/local/opt/OpenBLAS
) を使うように変更する(詳細後述) - cmakeで
-DWITH_LAPACK=OFF
オプションを追加する(根本的な解決にはなっていないが、エラーは消える)
問題
% make -j4
...
[ 42%] Building CXX object modules/core/CMakeFiles/opencv_core.dir/src/matmul.cpp.o
In file included from /Users/ryuyamamoto/cv/opencv/modules/core/src/hal_internal.cpp:49:
In file included from /Users/ryuyamamoto/cv/opencv/build/opencv_lapack.h:1:
In file included from /opt/OpenBLAS/include/cblas.h:5:
/opt/OpenBLAS/include/openblas_config.h:100:43: warning: '__STDC_VERSION__' is not defined, evaluates to 0 [-Wundef]
# if (defined(__STDC_IEC_559_COMPLEX__) || __STDC_VERSION__ >= 199901L || \
^
In file included from /Users/ryuyamamoto/cv/opencv/modules/core/src/hal_internal.cpp:49:
/Users/ryuyamamoto/cv/opencv/build/opencv_lapack.h:2:10: fatal error: 'LAPACKE_H_PATH-NOTFOUND/lapacke.h' file not found
# include "LAPACKE_H_PATH-NOTFOUND/lapacke.h"
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning and 1 error generated.
make[2]: *** [modules/core/CMakeFiles/opencv_core.dir/src/hal_internal.cpp.o] Error 1
make[2]: *** Waiting for unfinished jobs....
make[1]: *** [modules/core/CMakeFiles/opencv_core.dir/all] Error 2
make: *** [all] Error 2
システムにプリインストールされた /opt/OpenBLAS
を見にいってコケています。実際、
ls -l /opt/OpenBLAS/include/ (git)-[3.2.0]
total 200
-rw-r--r-- 1 ryuyamamoto 1000 44433 11 7 2014 cblas.h
-rw-r--r-- 1 ryuyamamoto 1000 46918 11 7 2014 f77blas.h
-rw-r--r-- 1 ryuyamamoto 1000 4632 11 7 2014 openblas_config.h
lapacke.h は存在していません。brew で入れた OpenBLASはどうかなぁと思って調べてみると、lapacke.h は存在いしているので、そちらを使うようにビルドオプションを変更すれば良さそうです。
% ls -l /usr/local/opt/openblas/include/ (git)-[3.2.0]
total 2544
-rw-r--r-- 1 ryuyamamoto admin 45648 12 30 21:11 cblas.h
-rw-r--r-- 1 ryuyamamoto admin 47356 12 30 21:11 f77blas.h
-rw-r--r-- 1 ryuyamamoto admin 1144601 4 13 2016 lapacke.h
-rw-r--r-- 1 ryuyamamoto admin 4388 4 13 2016 lapacke_config.h
-rw-r--r-- 1 ryuyamamoto admin 474 4 13 2016 lapacke_mangling.h
-rw-r--r-- 1 ryuyamamoto admin 33161 4 13 2016 lapacke_utils.h
-rw-r--r-- 1 ryuyamamoto admin 4680 12 30 21:11 openblas_config.h
解決方法
brewでいれたOpenBLASを見つけるように cmake/OpenCVFindOpenBLAS.cmake
を修正します。
diff --git a/cmake/OpenCVFindOpenBLAS.cmake b/cmake/OpenCVFindOpenBLAS.cmake
index 60594de..19a9165 100644
--- a/cmake/OpenCVFindOpenBLAS.cmake
+++ b/cmake/OpenCVFindOpenBLAS.cmake
@@ -50,6 +50,7 @@ SET(Open_BLAS_INCLUDE_SEARCH_PATHS
/usr/local/include
/usr/local/include/openblas
/usr/local/include/openblas-base
+ /usr/local/opt/openblas/include
/opt/OpenBLAS/include
$ENV{OpenBLAS_HOME}
$ENV{OpenBLAS_HOME}/include
@@ -64,6 +65,7 @@ SET(Open_BLAS_LIB_SEARCH_PATHS
/usr/lib64
/usr/local/lib
/usr/local/lib64
+ /usr/local/opt/openblas/lib
/opt/OpenBLAS/lib
$ENV{OpenBLAS}cd
$ENV{OpenBLAS}/lib
これで、ビルドが通るようになりました。めでたし。
OpenCVFindOpenBLAS.cmake
をいじらずに、適当な変数をoverrideする方がいいと思うのですが(-D_OPENBLAS_PATH=/usr/local/opt/OpenBLAS
的な)、いまいちやり方がわからずズルをしました。
あと、最初に書きましたが、-DWITH_LAPACK=OFF
とすれば、エラー事態は回避できます。ただし、パフォーマンスは落ちると思います。
参考
ビルドコマンド
参考までに、僕が使っているビルドオプションを貼っておきます。
% CC=/usr/local/bin/clang CXX=/usr/local/bin/clang++ cmake -DBUILD_TIFF=ON \
-DBUILD_opencv_java=OFF \
-DWITH_CUDA=OFF \
-DENABLE_AVX=ON \
-DWITH_OPENGL=ON \
-DWITH_OPENCL=OFF \
-DWITH_IPP=ON \
-DWITH_TBB=ON \
-DWITH_EIGEN=ON \
-DWITH_V4L=ON \
-DBUILD_TESTS=OFF \
-DBUILD_PERF_TESTS=OFF \
-DCMAKE_BUILD_TYPE=RELEASE \
-DBUILD_opencv_viz=OFF \
-DCMAKE_INSTALL_PREFIX=$(python -c "import sys; print(sys.prefix)") -DPYTHON_EXECUTABLE=$(which python) \
-DPYTHON_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \
-DPYTHON_PACKAGES_PATH=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") \
-DWITH_OPENMP=ON \
-DWITH_QT=ON \
-DWITH_VTK=OFF \
-DWITH_LAPACK=ON ..
-
現在のバージョンは 0.2.18_2 ↩