1)交叉编译工具
不同平台会提供对应的交叉编译工具,比如rockpi,树莓派,arm等
这里将使用rockpi提供的aarch64-linux-gnu-相关工具
2)opencv源码
包含opencv-4.1.0以及opencv_contrib-4.1.0
3)安装好cmake及cmake-gui
1)创建好编译输出的目录,运行cmake-gui
填写好顶部source code以及binaries
点击左下configure
输入好以上部分
2)一些配置
opencv_enable_nonfree 勾选true
BUILD_SHARED_LIBS=YES
CMAKE_BUILD_TYPE=Release
CMAKE_INSTALL_PREFIX=这里要填绝对路径,否则可能报错
OPENCV_EXTRA_MODULES_PATH=…/…/opencv_contrib-4.1.0/modules/ …
其他可能要加的配置(对应后面的错误)
CMAKE_EXE_LINKER_FLAGS = -lpthread -lrt -ldl
最后configure ,然后Generate就好了
主要添加了 opencv-contrib
退出cmake-gui
命令行执行 make -j6 (我这有6个cpu)
1)common.cc:52:2: error: #error “No suitable threading library available.” #error "No suitable threading library available.
在xxxx/opencv-4.1.0/3rdparty/protobuf/src/google/protobuf/stubs/common.cc 中添加下面这一行,注意位置
#define HAVE_PTHREAD
[ 32%] Built target opencv_ml
../../lib/libopencv_core.so:对‘pthread_key_create’未定义的引用
../../lib/libopencv_core.so:对‘dladdr’未定义的引用
../../lib/libopencv_core.so:对‘pthread_getspecific’未定义的引用
../../lib/libopencv_core.so:对‘dlopen’未定义的引用
../../lib/libopencv_core.so:对‘pthread_key_delete’未定义的引用
../../lib/libopencv_core.so:对‘dlclose’未定义的引用
../../lib/libopencv_core.so:对‘dlsym’未定义的引用
../../lib/libopencv_core.so:对‘pthread_setspecific’未定义
打开cmake-gui设置CMAKE_EXE_LINKER_FLAGS = -lpthread -lrt -ldl
/media/zhutao/000557190002B51E/develop/项目/开发板/rockpi4a/交叉编译工具/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/7.3.1/../../../../aarch64-linux-gnu/bin/ld: 找不到 -lfreetype
/media/zhutao/000557190002B51E/develop/项目/开发板/rockpi4a/交叉编译工具/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/7.3.1/../../../../aarch64-linux-gnu/bin/ld: 找不到 -lharfbuzz
打开cmake-gui设置BUILD_opencv_freetype 不勾选
这个可能有附带问题,目前不得而知。 另一种解决办法当然是缺啥补啥,下载对应的源码进行交叉编译和链接,但是给的时间比较短,怕依赖的库还循环依赖别的库,那就gg了
4)
/media/zhutao/000557190002B51E/develop/项目/开发板/rockpi4a/交叉编译工具/opencv-4.1.0/modules/imgcodecs/src/grfmt_jpeg.cpp:224:58: 错误: invalid conversion from ‘uchar* {aka unsigned char*}’ to ‘const JOCTET* {aka const char*}’ [-fpermissive]
state->source.pub.next_input_byte = m_buf.ptr();
诸如此类类型转换错误,需要去改源码了,添加显示转换
5)
/media/zhutao/000557190002B51E/develop/项目/开发板/rockpi4a/交叉编译工具/opencv-4.1.0/modules/videoio/src/cap_dc1394_v2.cpp:59:10: 致命错误: dc1394/dc1394.h:没有那个文件或目录
#include
打开cmake-gui设置WITH_1394 不勾选
6)
../../lib/libopencv_imgcodecs.so:对‘png_init_filter_functions_neon’未定义的引用
../../lib/libopencv_imgcodecs.so:对‘png_riffle_palette_rgba’未定义的引用
../../lib/libopencv_imgcodecs.so:对‘png_do_expand_palette_neon_rgb’未定义的引用
../../lib/libopencv_imgcodecs.so:对‘png_do_expand_palette_neon_rgba’未定义的引用
collect2: 错误: ld 返回 1
修改opencv下的 /3rdparty/libpng/pngpriv.h
130行 # if (defined(ARM_NEON) || defined(__ARM_NEON)) &&
改为
# if defined(PNG_ARM_NEON) && (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \
/boostdesc.cpp:653:20: 致命错误: boostdesc_bgm.i:没有那个文件或目录
将
boostdesc_bgm.i
boostdesc_bgm_bi.i
boostdesc_bgm_hd.i
boostdesc_lbgm.i
boostdesc_binboost_064.i
boostdesc_binboost_128.i
boostdesc_binboost_256.i
vgg_generated_120.i
vgg_generated_64.i
vgg_generated_80.i
vgg_generated_48.i
下载好拷贝到opencv_contrib/modules/xfeatures2d/src/目录下
8)
致命错误: features2d/test/test_detectors_regression.impl.hpp:没有那个文件或目录
修改项目的 CMakeLists.txt, 在 570 行添加
include_directories(“modules”)
至此,可以编译到100%了
注:如果是从其他地方考过来,可能有权限问题,需要重新从压缩包里解压opencv源码和交叉编译工具,否则可能报错 error trying to exec ‘cc1plus’execvp:No such file