我的AI之路(15)--Linux下编译OpenCV3的最新版OpenCV3.4.1及错误解决

      断断续续的花费了很长时间才从URL https://jaist.dl.sourceforge.net/project/opencvlibrary/opencv-unix/3.4.1/opencv-3.4.1.zip把OpenCV3的最新版OpenCV3.4.1下载到了本地,因为下载很慢,而且中途总是中断,所以下载一定要使用有断点续传功能的工具。为了方便有需要的同学下载,我把这个文件上传到了CSDN,可以去页面https://download.csdn.net/download/xccccz/10541282 下载。

      另外编译OpenCV3.4开始后需要下载一个第三方的ippicv文件,OpenCV默认的下载方式很慢而且容易失败,在opencv-3.4.1/3rdparty/ippicv/ippicv.cmake文件里可以看到各种不同平台所需下载的不同文件,对于Intel 64位平台Linux上需要下载的文件是ippicv_2017u3_lnx_intel64_general_20170822.tgz,https://github.com/opencv/opencv_3rdparty/tree/ippicv/master_20170822/ippicv/这里可以看到全部文件列表,直接下载容易失败,可以先手工下载下来到本地,然后修改ippicv.cmake文件让cmake从本地读取这个文件。

手工下载两个途径:

1)为了方便有需要的同学下载,我把我已经下载了的这个文件上传到了CSDN,可以去页面https://download.csdn.net/download/xccccz/10541306下载,速度会很快,比自己去原始网站上下载快多了。

2) 去原始网站上下载,使用opencv-3.4.1/3rdparty/ippicv/ippicv.cmake文件里写的带commit_code的路径,使用wget命令手工下载下来,比如:

wget  https://raw.githubusercontent.com/opencv/opencv_3rdparty/dfe3162c237af211e98b8960018b564bc209261d/ippicv/ippicv_2017u3_lnx_intel64_general_20170822.tgz

dfe3162c237af211e98b8960018b564bc209261d即IPPICV_COMMIT的值。

下载完后,修改opencv-3.4.1/3rdparty/ippicv/ippicv.cmake,在这句之前:

  ocv_download(FILENAME ${OPENCV_ICV_NAME}
               HASH ${OPENCV_ICV_HASH}
               URL
                 "${OPENCV_IPPICV_URL}"
                 "$ENV{OPENCV_IPPICV_URL}"
                 "https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/"
               DESTINATION_DIR "${THE_ROOT}"
               ID IPPICV
               STATUS res

               UNPACK RELATIVE_URL)

增加下面的这句让它从本地读取这个文件,而不是再从默认的网上路径https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/ 去下载:

扫描二维码关注公众号,回复: 3194967 查看本文章

set(OPENCV_IPPICV_URL "file://<file_local_path>")

file_local_path就是你本地存放ippicv_2017u3_lnx_intel64_general_20170822.tgz的路径,比如我的Linux上这个文件在~/install下:

set(OPENCV_IPPICV_URL "file:///home/fychen/install/"),然后就可以开始编译OpenCV3.4.1了。

为了方便有需要的同学下载,我也把这个文件上传到了CSDN,可以去页面https://download.csdn.net/download/xccccz/10541306下载。

编译之前确认你安装了编译OpenCV3的一些支持包,否则编译过程中会报很多错,详情参见:我的AI之路(11)--如何解决在Linux下编译OpenCV3时出现的多个错误

像编译OpenCV3.2一样,解压opencv3.4.1压缩包后:

cd opencv-3.4.1

mkdir build

cd build

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..

然后执行make,过一会报错:

[ 35%] Linking CXX executable ../../../bin/opencv_test_cudev
../../../lib/libopencv_core.so.3.4.1:对‘dgeqrf_’未定义的引用
../../../lib/libopencv_core.so.3.4.1:对‘sposv_’未定义的引用
../../../lib/libopencv_core.so.3.4.1:对‘sgesdd_’未定义的引用
../../../lib/libopencv_core.so.3.4.1:对‘sgeqrf_’未定义的引用
../../../lib/libopencv_core.so.3.4.1:对‘dgesv_’未定义的引用
../../../lib/libopencv_core.so.3.4.1:对‘sgels_’未定义的引用
../../../lib/libopencv_core.so.3.4.1:对‘sgesv_’未定义的引用
../../../lib/libopencv_core.so.3.4.1:对‘dgetrf_’未定义的引用
../../../lib/libopencv_core.so.3.4.1:对‘sgetrf_’未定义的引用
../../../lib/libopencv_core.so.3.4.1:对‘spotrf_’未定义的引用
../../../lib/libopencv_core.so.3.4.1:对‘dgels_’未定义的引用
../../../lib/libopencv_core.so.3.4.1:对‘dgesdd_’未定义的引用
../../../lib/libopencv_core.so.3.4.1:对‘dposv_’未定义的引用
../../../lib/libopencv_core.so.3.4.1:对‘dpotrf_’未定义的引用

collect2: 错误:ld 返回 1

这是因为找不到lapack库,怎么回事呢?OpenCV3.2编译时在安装openblas和lapack后没问题呀,于是对比OpenCV3.2和OpenCV3.4.1编译后生成的opencv_test_cudev模块下面的代码,两者的build/modules/cudev/test/CMakeFiles/opencv_test_cudev.dir/link.txt文件里稍有不同,OpenCV3.2用的openblas库,而OpenCV3.4.1使用的是INVIDIA的cublas库,大概明白了是怎么回事了,安装cuda9.0后,在/usr/local/cuda-9.0/lib64/下只有libcublas.so文件没有libcublas.a文件,使用源码编译安装的openblas同时生成了libopenblas静态库和动态库并拷贝到/usr/local/lib下,静态库/usr/local/lib/libopenblas.a里联编进了lapack.a的内容,而根据常识,动态库libcublas.so是不会包含lapack内容的,所以我只需要把lapack库包含进来应该可以了,于是找到CMakeLists.txt里设置link库路径的地方,在下面地方加一句:

  if(HAVE_CUBLAS)
    set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} ${CUDA_cublas_LIBRARY})
    set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} "lapack")
  endif()

然后再make,果然报错不同了:

[ 35%] Linking CXX executable ../../../bin/opencv_test_cudev
../../../lib/libopencv_core.so.3.4.1:对‘_gfortran_transfer_character_write’未定义的引用
../../../lib/libopencv_core.so.3.4.1:对‘_gfortran_st_write_done’未定义的引用
../../../lib/libopencv_core.so.3.4.1:对‘_gfortran_compare_string’未定义的引用
../../../lib/libopencv_core.so.3.4.1:对‘_gfortran_concat_string’未定义的引用
../../../lib/libopencv_core.so.3.4.1:对‘_gfortran_stop_string’未定义的引用
../../../lib/libopencv_core.so.3.4.1:对‘_gfortran_transfer_integer_write’未定义的引用
../../../lib/libopencv_core.so.3.4.1:对‘_gfortran_string_len_trim’未定义的引用
../../../lib/libopencv_core.so.3.4.1:对‘_gfortran_st_write’未定义的引用

collect2: 错误:ld 返回 1

这应该是因为gfortran库没有包含进来,于是在后面再加一句:

  if(HAVE_CUBLAS)
    set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} ${CUDA_cublas_LIBRARY})
    set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} "lapack")
    set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} "gfortran")

  endif()

再make,果然第35步编译过了,过了一会再报错,出现在/home/fychen/install/opencv-3.4.1/modules/core/include/opencv2/core/cuda/vec_math.hpp第203行和205行:

[ 57%] Building NVCC (Device) object modules/cudabgsegm/CMakeFiles/cuda_compile.dir/src/cuda/cuda_compile_generated_mog2.cu.o

/home/fychen/install/opencv-3.4.1/modules/core/include/opencv2/core/cuda/vec_math.hpp(203): error: calling a constexpr __host__ function("abs") from a __device__ function("abs") is not allowed. The experimental flag '--expt-relaxed-constexpr' can be used to allow this.

把opencv-3.4.1/modules/core/include/opencv2/core/cuda/vec_math.hpp里

CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, /*::abs*/, uchar, uchar)
CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, ::abs, char, char)
CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, /*::abs*/, ushort, ushort)
CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, ::abs, short, short)
CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, ::abs, int, int)

改成:

CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, /*::abs*/, uchar, uchar)
CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, /*::abs*/, char, char)
CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, /*::abs*/, ushort, ushort)
CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, /*::abs*/, short, short)

CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, ::abs, int, int)

再make即可顺利完成编译,然后make install即可。

我的AI之路(1)--前言

我的AI之路(2)--安装Fedora 28

我的AI之路(3)--安装Anaconda3 和Caffe

我的AI之路(4)--在Anaconda3 下安装Tensorflow 1.8

我的AI之路(5)--如何选择和正确安装跟Tensorflow版本对应的CUDA和cuDNN版本

我的AI之路(6)--在Anaconda3 下安装PyTorch

我的AI之路(7)--安装OpenCV3_Python 3.4.1 + Contrib以及PyCharm

我的AI之路(8)--体验用OpenCV 3的ANN进行手写数字识别及解决遇到的问题

我的AI之路(9)--使用scikit-learn

我的AI之路(10)--如何在Linux下安装CUDA和CUDNN

我的AI之路(11)--如何解决在Linux下编译OpenCV3时出现的多个错误

我的AI之路(12)--如何配置Caffe使用GPU计算并解决编译中出现的若干错误

我的AI之路(13)--解决编译gcc/g++源码过程中出现的错误

我的AI之路(14)--Caffe example:使用MNIST数据集训练和测试LeNet-5模型

我的AI之路(15)--Linux下编译OpenCV3的最新版OpenCV3.4.1及错误解决

我的AI之路(16)--云服务器上安装和调试基于Tensorflow 1.10.1的训练环境

我的AI之路(17)--Tensorflow和Caffe的API及Guide

我的AI之路(18)--Tensorflow的模型安装之object_detection

猜你喜欢

转载自blog.csdn.net/XCCCCZ/article/details/81044726
今日推荐