记录下笔者源码编译 opencv 的过程( Ubuntu 环境下 ),以及某些报错的解决方法,希望可以帮助有需要的人...
源码编译 opencv 的主要流程
1.获取 opencv 源代码,用户可以在 opencv-github 获取对应版本的 opencv 源代码,并将其解压;
upzip opencv-3.2.0.zip -d ~ //解压 .zip 文件,默认解压至当前目录,通过 -d 指定解压的目标目录 tar -xvzf opencv-3.2.0.tar.gz -C ~ //解压 tar.gz 文件,通过 -C 命令解压至目标目录
2.进入解压完成的源码目录,并在其中创建一个新的目录 build,进入该目录;
cd ~/opencv-3.2.0 //进入解压好的 opencv 源码目录 mkdir build //在源码目录中创建新目录 build cd build //进入 build 目录
3.使用 cmake 命令生成编译整个 opencv 项目的 makefile 等内容,并完成对系统环境的检测,为实际编译过程确定环境。这一步的 cmake 命令中可以加入很多的编译选项,来选择如何对 opencv 源码进行编译,如指定那些模块会被编译,哪些模块不进行编译,以及哪些模块由于依赖关系未被满足(如系统上不存在其所需要的相关库组件等)而无法编译等。是最重要的一步。如果在使用中只需要使用 opencv 的部分模块的话,可以在该阶段进行指定,进而简化编译流程和对系统环境的要求。该步骤所生成的所有信息均存放在之前步骤所新建的 build 目录下,故而可以通过删除 build 目录下的内容来重新执行本步骤。笔者使用的编译指令如下所示。
cmake -DCMAKE_BUILD_TYPE=RELEASE -DBUILD_opencv_gpu=OFF -DWITH_IPP=OFF -DWITH_CUDA=OFF -DWITH_LAPACK=OFF -DCMAKE_INSTALL_PREFIX=~/opencv_src -DBUILD_TIFF=ON ..
笔者搜集到一些该步骤下可以使用的 cmake 参数,用户可以根据需要进行使用。
-DCMAKE_INSTALL_PREFIX=/path/to/target/ //编译完成后 make install 的安装目录,默认为 /usr/local/ -DBUILD_opencv_python2=OFF -DBUILD_opencv_python3=OFF //和对应的 python 模块相关 -DOPENCV_GENERATE_PKGCONFIG=ON -DBUILD_opencv_world=OFF //将所有的动态库融合为一个 libopencv_world.so 库 -DOPENCV_EXTRA_MODULES_PATH=/path/to/target/ // 如果需要 opencv contrib 的功能,如人脸识别,则通过该参数指定 contrib 目录下 module 文件夹的地址
事实上,这些 cmake 的选项基本可以在 opencv 的源码目录下的 CMakeLists.txt 中找到。在笔者设备上即为 ~/opencv-3.2.0/CMakeLists.txt 文件。
在执行 cmake 命令完成后,会输出对环境和编译模块的检测报告,用户可以从该报告中查看 opencv 编译环境的相关情况。如在 Opencv modules 部分,可以看到后续会对哪些模块进行编译,而哪些模块无法使用。
4.在 cmake 命令执行成功后,直接通过 make 命令执行编译过程;
make -j4 //执行 make 开始编译流程,其中的 -j4 选项指定运行的任务数,可大大加快编译速度
5.进行安装操作;
make install //执行安装操作,会将编译好库文件,可执行文件等复制至 CMAKE_INSTALL_PREFIX 指定的目录
可能的报错及解决方法:
libzstd.so.1.3.7, needed by /home/xxxxanaconda3/lib/libtiff.so.5
在进行编译的时候,产生报错 "libzstd.so.1.3.7, needed by home/xxxx/anaconda3/lib/libtiff.so.5". 当时的报错的原因在于进行 opencv 编译的时候,使用了存放在 Anaconda 目录 anaconda3/lib/ 中的 libtiff.so 库,原理上其依赖的是同一 anaconda3/lib 目录下的 libzstd.so 库文件,而该目录并不在系统的库文件搜索路径中( /etc/ld.so.conf 指定),使得最终产生找不到 libzstd.so 库的报错。
解决的方案应该是有两种,一种首先查看一下当前设备的 Anaconda 安装目录中的库目录(也就报错信息中的 /home/xxx/ananconda3/lib/ )中是否存在上述两个库,若存在,则将上述两个库文件所在的文件夹加入系统的库文件搜索路径中即可,这里主要通过环境变量 LD_LIBRARY_PATH 指定。这种方式要确保系统上确实存在某个目录中存在上述满足依赖关系的库文件,如本例中 /home/xxx/anaconda3/lib/ 目录中即存在 libtiff.so 库和其所依赖的 libzstd.so 库。
1)首先通过 grep -E 命令搜索多个字符串结果,笔者的设备上的 ~/anaconda3/lib/ 文件夹中即显示有 libtiff.so.5 和 libzstd.so.1.3.7. 首先确定对应的目录下确实包含有上述报无法找到错误的库。
ls ~/anaconda3/lib/ | grep -E "zstd|tiff" //查看用户主目录 ~ 下的 anaconda3/lib/ 目录中是否存在名字带 zstd 或 tiff 的库
2) 将上述目录加入系统库文件搜索路径中,通过对环境变量 LD_LIBRARY_PATH 的设置实现
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xxxx/anaconda3/lib/ //将上述存在 libzstd.so 库的路径加入库文件搜索路径中
第二种解决方法即 opencv 在进行编译的时候实际可以选择不选用系统上的 libtiff.so 库,而是直接对其所依赖的 tiff 模块进行编译,从而避免产生缺少依赖库的情况。只需在 cmake 阶段加入参数 -D BUILD_TIFF=ON 即可。如笔者的 opencv-3.2.0 源码包中,其目录 3rdparty 下即包含有 libtiff 的源码,选择指定上述选项即使系统通过上述源码进行编译。笔者即通过第二种方法解决。
-DBUILD_TIFF=ON // cmake 阶段加入该参数,使得 opencv 自行编译 libtiff.so 等依赖库,而不依赖使用系统上的已有库
参考:
complie and link,warning not found libpcre.so.1
ICV: Local copy of ICV package has invalid MD5 hash
-DWITH_IPP=OFF //关闭对 ippicv 模块的使用
参考:
OpenCV build fails because I cannot download ICV on our build farm——opencv
fatal error: LAPACKE_H_PATH-NOTFOUND/lapacke.h: No such file or directory #include "LAPACKE_H_PATH-NOTFOUND/lapacke.h"
上述报错的原因为在编译时的 build 目录下存在一个 opencv_lapack.h 头文件,而其中存在语句 #include "LAPACKE_H_PATH-NOTFOUND/lapacke.h“,而实际上系统无法定位得到对应的 lapacke.h 头文件。搜索的解决方案有两种,一种即若用户确定不需要 LAPACK 库的支持,可以在 cmake 阶段使用 -DWITH_LAPACK=OFF 选项关闭 LAPACK 相关的编译流程,从而避免出现问题(需要重新执行 cmake 指令)。
-DWITH_LAPACK=OFF //关闭对应的 LAPACK 选项
另一种即需要补齐缺失的头文件,这种方法需要自己具备有安装依赖的权限。具体而言,可以通过 apt install 安装对应的 liblapacke-dev 等包,如下命令所示。
sudo apt install liblapacke-dev checkinstall //安装缺失的依赖库
在安装之后,将上述 #include"LAPACKE_H_PATH-NOTFOUND/lapacke.h" 替换为语句 "lapacke.h" 即可完成正确编译。
参考:
fata error: LAPACKE_H_PATH-NOTFOUND when building OpenCV 3.2
与 contrib 模块一起编译时出现 file DOWNLOAD HASH mismatch 的问题
boostdesc_lbgm.i
boostdesc_bgm.i
boostdesc_binboost_064.i
boostdesc_bgm_bi.i
boostdesc_bgm_hd.i
boostdesc_binboost_128.i
boostdesc_binboost_256.i
vgg_generated_48.i
vgg_generated_64.i
vgg_generated_80.i
vgg_generated_120.i
另外还有可能遇到 protobuf-cpp-3.1.0.tar.gz 的下载问题,同样自行下载可以解决,下载地址 https://github.com/google/protobuf/releases/download/v3.1.0/protobuf-cpp-3.1.0.tar.gz ,或者直接网络搜索 protobuf-cpp-3.1.0.tar.gz download。