海思3559环境采用cmake-gui交叉编译opencv及opencv_contrib
前言
海思3559环境采用cmake-gui交叉编译opencv及opencv_contrib过程以及出现的问题解决。
- 建议将问题解决部分的修改和配置完成后,再进行编译,避免浪费时间。
- 一定要弄一个翻墙的VPN,不然编译时,configure会有很多文件无法下载,导致编译失败。
环境:
ubuntu:16.04
海思:海思3559
opencv:opencv-4.2.0,opencv_contrib-4.2.0
一、环境
ubuntu:16.04
海思:3559a
opencv:4.2.0
opencv-contrib:4.2.0
安装cmake-gui:
先装cmake:sudo apt-get install cmake
再装cmake-gui:sudo apt-get install cmake-qt-gui
二、使用cmake-gui编译
1.打开cmake-gui
打开ubuntu的terminal终端,输入cmake-gui,打开cmake的gui界面。
2.编译配置
1.路径填写
在source code 填入解压后的opencv4.2.0路径;
在build 填入编译输出路径,这里我的路径是单独建立的文件夹opencv-build。
填写完成后点击“configure”。
2.编译器选择
选择第四项,点击“next",填写编译器路径。
Operation System — arm-himix200-linux
gcc ---- /opt/hisi-linux/x86-arm/arm-himix200-linux/bin/arm-himix200-linux-gcc
g++ ---- /opt/hisi-linux/x86-arm/arm-himix200-linux/bin/arm-himix200-linux-g++
编译器路径需要根据自己ubuntu系统的编译器路径来填写。
3.修改配置
1.修改CMAKE_INSTALL_PREFIX
这个是最后库的安装路径,文件夹是我自己创建的。
2.添加OPENCV_EXTRA_MODULE_PATH
也就是contrib的modules路径
3.添加CMAKE_FIND_ROOT_PATH
/opt/hisi-linux/x86-arm/arm-himix200-linux/bin/
4.勾选BUILD_opencv_world库
这样编译出来的库就一个XXXXworld.so,而不是一堆库。
5.源代码修改
在opencv-4.2.0中的
modules/videoio/src/cap_dshow.cpp中的include “cap_dshow.hpp”上一行添加
#define NO_DSHOW_STRSAFE
6.cmake参数修改
在opencv4.2.0目录下,修改最顶层的CMakeList.txt,在include(cmake/OpenCVMinDepVersions.cmake)后面添加:
SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-pthread -ldl")
SET(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} "-pthread -ldl")
4.问题解决
1.zlib.h问题
fatal error: zlib.h: No such file or directory
对于该问题,博客上有的说可以直接在cmake-gui上面添加ZLIB_INCLUDE_DIR配置,这个我尝试过,是不行的,configure后,这个添加的配置会消失,不起作用,原因未知,因此配置项建议在CMakeLists.txt中添加,正确的解决方式应该是在CMakeLists.txt添加路径。
解决:
在opencv4.2.0目录下,修改最顶层的CMakeList.txt,找到ocv_include_directories(${OPENCV_CONFIG_FILE_INCLUDE_DIR}),并在下面添加:ocv_include_directories(./3rdparty/zlib)
2.No suitable threading问题
common.cc:52:2: error: #error “No suitable threading library available.” #error "No suitable threading library available.
如果在顶层的CMakeLists.txt中添加了-pthread -ldl,应该不会出现此问题。(有些博客说的在cmake-gui添加额外CMAKE_CXX_FLAS,CMAKE_C_FLAS,因为configure后添加的配置会失效,原因未知,因此配置项建议在CMakeLists.txt中添加)
解决:
在opencv-4.2.0/3rdparty/protobuf/src/google/protobuf/stubs/common.cc 中添加下面这一行
#define HAVE_PTHREAD
3.-fpermissive问题
error: invalid conversion from ‘uchar* {aka unsigned char*}’ to ‘const JOCTET* {aka const char*}’ [-fpermissive]
在opencv4.2.0目录下,修改最顶层的CMakeList.txt,SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} “-pthread -ldl”)添加"-fpermissive"
4.png的引用未定义错误
undefined reference to `png_init_filter_functions_neon’
有博客给的解决方案是将BUILD_PNG勾选去掉,这个也是不可行的。默认的配置本来就没有勾选BUILD_PNG,正确解决方式如下:
修改:
找到3rdparty/libpng/CMakeLists.txt在最上面加上
SET(ARM 1)
SET(ENABLE_NEON 1)
6.编译
以上参数修改完成后,再次点击configure。
中间要下载一些东西,所以要保证有网络,而且需要翻墙才能configure完成。(不翻墙会出现下载失败,尝试多次失败后,弄了个VPN,才configure成功)。
出现configuring done后,且中间的配置参数没有红色后,点击generate,出现generating done即可。
注意:configure时,cmake-gui顶部会有出现红色,如下所示,提示
System is unkown to cmake…
Detected processor:…
这个是可以忽略的。
进入编译输出文件夹opencv-build,打开terminal终端,输入make,然后等待完成。make完成后,终端输入make install,到此opencv的交叉编译就完成了。
make的时间特别长,建议看会书,或者玩会游戏。