linux使用cmake交叉编译opencv

文章目录

  • 正文
    • 1.准备工作
    • 2.cmake配置
    • 3.开始编译
    • 4.各种出错及解决方案

正文

1.准备工作

1)交叉编译工具
不同平台会提供对应的交叉编译工具,比如rockpi,树莓派,arm等
这里将使用rockpi提供的aarch64-linux-gnu-相关工具

2)opencv源码
包含opencv-4.1.0以及opencv_contrib-4.1.0

3)安装好cmake及cmake-gui

2.cmake配置

1)创建好编译输出的目录,运行cmake-gui
linux使用cmake交叉编译opencv_第1张图片
填写好顶部source code以及binaries
点击左下configure
linux使用cmake交叉编译opencv_第2张图片
输入好以上部分

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

3.开始编译

退出cmake-gui
命令行执行 make -j6 (我这有6个cpu)

4.各种出错及解决方案

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

linux使用cmake交叉编译opencv_第3张图片
2 )

[ 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

你可能感兴趣的:(linux,opencv)