linux使用cmake交叉编译opencv

12 篇文章 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
在这里插入图片描述
填写好顶部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

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

在这里插入图片描述
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 <dc1394/dc1394.h>

打开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

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CMake是一个跨平台的自动化构建工具,可以帮助我们更方便地管理和构建项目。下面是使用CMake进行交叉编译OpenCV的步骤: 1. 安装交叉编译工具链 首先需要安装交叉编译工具链,这里以ARM架构为例,可以通过命令行安装: ``` sudo apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf ``` 2. 下载OpenCV源码 从OpenCV官网下载源码:https://opencv.org/releases/,选择一个版本进行下载并解压。 3. 创建交叉编译工具链文件 在OpenCV源码目录下创建一个名为toolchain-arm-linux-gnueabihf.cmake的文件,文件内容如下: ``` set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR arm) set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc) set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++) set(CMAKE_FIND_ROOT_PATH /usr/arm-linux-gnueabihf) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) ``` 其中,CMAKE_C_COMPILER和CMAKE_CXX_COMPILER是交叉编译器的路径,CMAKE_FIND_ROOT_PATH是交叉编译时需要查找的库文件路径。 4. 创建build目录并进入 ``` mkdir build && cd build ``` 5. 运行CMake命令 ``` cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain-arm-linux-gnueabihf.cmake -DCMAKE_INSTALL_PREFIX=/usr/arm-linux-gnueabihf .. ``` 其中,-DCMAKE_TOOLCHAIN_FILE指定交叉编译工具链文件的路径,-DCMAKE_INSTALL_PREFIX指定安装路径。 6. 运行make命令进行编译 ``` make ``` 7. 运行make install命令进行安装 ``` make install ``` 8. 将生成的库文件和头文件复制到目标系统中 将编译生成的库文件和头文件复制到目标系统中,供应用程序使用。 至此,使用CMake进行OpenCV交叉编译的步骤就完成了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值