[yocto]yocto编译opencv4.5编译报错

yocto编译opencv报错

背景:使用社区的opencv资源(别的包依赖opencv,而不单独添加配方文件编译目标)

1. undefined reference to `cv::String::deallocate()’

  • 错误原因: opencv版本不匹配,opencv3.*opencv4.*一些接口不相同
  • 解决: 确保链接了opencv4的lib,并且include正确版本的头文件

2.链接目标版本不匹配

/usr/local/cortex-a53-2022.08-gcc12.1-linux5.15/bin/../lib/gcc/aarch64-linux-gnu/12.1.1/../../../../aarch64-linux-gnu/bin/ld: warning: libopencv_core.so.3.4, needed by /xxx/libblade_runner.so, may conflict with libopencv_core.so.4.5
/usr/local/cortex-a53-2022.08-gcc12.1-linux5.15/bin/../lib/gcc/aarch64-linux-gnu/12.1.1/../../../../aarch64-linux-gnu/bin/ld: /xxx/test_blade_runner.o: undefined reference to symbol '_ZN2cv6String10deallocateEv'
/usr/local/cortex-a53-2022.08-gcc12.1-linux5.15/bin/../lib/gcc/aarch64-linux-gnu/12.1.1/../../../../aarch64-linux-gnu/bin/ld: /xxx/libopencv_core.so.3.4: error adding symbols: DSO missing from command line
  • 原因:libopencv_core.so.3.4libopencv_core.so.4.5分别对应两个opencv版本,并且报错是由编译test_blade_runner.o引起的
    • 使用readdlf -d test_blade_runner.so发现其版本为opencv3.4,但是编译目标使用的opencv版本为opencv3.
  • 重新使用opencv4编译test_blade_runner.so,再重新编译

3.链接rdeps错误

ERROR: prebuild-bladerunner-1.0-r0 do_package_qa: QA Issue: /usr/lib/libblade_runner.so.1.1.3 contained in package prebuild-bladerunner requires libopencv_core.so.4.5()(64bit), but no providers found in RDEPENDS:prebuild-bladerunner? [file-rdeps]
ERROR: prebuild-bladerunner-1.0-r0 do_package_qa: QA Issue: /usr/lib/libblade_runner.so.1.1.3 contained in package prebuild-bladerunner requires libopencv_calib3d.so.4.5()(64bit), but no providers found in RDEPENDS:prebuild-bladerunner? [file-rdeps]
  • 错误背景:在确保配方文件已经正确添加DEPENDS/RDEPENDS的前提下依然出现该错误

    DEPENDS += "opencv"
    RDEPENDS:${PN} += "libcavalrymem libnnctrl opencv"
    
  • 原因: 检查编译产物tmp/sysroots-components/cortexa53-crypto/opencv/usr/lib发现目标产物版本为libopencv_core.so.405,应该为libopencv_core.so.4.5

    • 产物为libopencv_alphamat.so -> libopencv_alphamat.so.405 -> libopencv_alphamat.so.4.5.5

    • 且目录下/tmp/work/cortexa53-crypto-poky-linux/prebuild-bladerunner/1.0-r0下检查libopencv_core.4.5

      readelf -d  recipe-sysroot/usr/lib/libopencv_core.so.4.5.5
      
      Dynamic section at offset 0x262758 contains 34 entries:
        Tag        Type                         Name/Value
       0x0000000000000001 (NEEDED)             Shared library: [libz.so.1]
       0x0000000000000001 (NEEDED)             Shared library: [libtbb.so.12]
       0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
       0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
       0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
       0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
       0x0000000000000001 (NEEDED)             Shared library: [ld-linux-aarch64.so.1]
       0x000000000000000e (SONAME)             Library soname: [libopencv_core.so.405]
       0x000000000000000c (INIT)               0x5f7b0
       0x000000000000000d (FINI)               0x1df420
      
    • 发现SONAME指定为libopencv_core.so.405libblade_runner.so.1.1.3需要的NEEDEDlibopencv_core.so.4.5所以产生错误

  • 解决方法:在/tmp/work/cortexa53-crypto-poky-linux/opencv/4.5.5-r0/目录下检索VERSION相关参数(参数太多,需要筛选)

    /tmp/work/cortexa53-crypto-poky-linux/opencv/4.5.5-r0/cmake/OpenCVVersion.cmake
    
    OpenCVVersion.cmake:15:ocv_update(OPENCV_SOVERSION "${OPENCV_VERSION_MAJOR}${OPENCV_VERSION_MINOR_2DIGITS}")
    OpenCVVersion.cmake:16:ocv_update(OPENCV_LIBVERSION "${OPENCV_VERSION_MAJOR}.${OPENCV_VERSION_MINOR}.${OPENCV_VERSION_PATCH}")
    
    • 修改: OPENCV_SOVERSIONocv_update(OPENCV_SOVERSION "${OPENCV_VERSION_MAJOR}.${OPENCV_VERSION_MINOR_2DIGITS}")

    • 生成patch

      $ git status
      
      tmp/work/cortexa53-crypto-poky-linux/opencv/4.5.5-r0/git/cmake$ git diff OpenCVVersion.cmake
      diff --git a/cmake/OpenCVVersion.cmake b/cmake/OpenCVVersion.cmake
      index 6ffaab94cf..d743634a7e 100644
      --- a/cmake/OpenCVVersion.cmake
      +++ b/cmake/OpenCVVersion.cmake
      @@ -12,7 +12,7 @@ set(OPENCV_VERSION "${OPENCV_VERSION_PLAIN}${OPENCV_VERSION_STATUS}")
      
       string(REGEX MATCH "[0-9][0-9]$" OPENCV_VERSION_MINOR_2DIGITS "00${OPENCV_VERSION_MINOR}")
       string(REGEX MATCH "[0-9][0-9]$" OPENCV_VERSION_PATCH_2DIGITS "00${OPENCV_VERSION_PATCH}")
      -ocv_update(OPENCV_SOVERSION "${OPENCV_VERSION_MAJOR}${OPENCV_VERSION_MINOR_2DIGITS}")
      +ocv_update(OPENCV_SOVERSION "${OPENCV_VERSION_MAJOR}.${OPENCV_VERSION_MINOR}")
       ocv_update(OPENCV_LIBVERSION "${OPENCV_VERSION_MAJOR}.${OPENCV_VERSION_MINOR}.${OPENCV_VERSION_PATCH}")
      
       # create a dependency on the version file
      
      git add .
      git commit -m "opencv change version"
      git foramt-patch -1
      
    • 打补丁

      • :通过使用bbapend文件的方式追加补丁到社区的opencv目标中
      FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:" (显式指定patch保存地址)
      SRC_URI:append = " file://0001-opencv-change-soname.patch"
      
  • ocv_update函数

    ocv_update(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "Configs" FORCE)
    if(DEFINED CMAKE_BUILD_TYPE)
      set_property( CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS ${CMAKE_CONFIGURATION_TYPES} )
    endif()
    

4. 编译产物中缺少objdetect module相关资源

  • 检查git下载的源码发现
    • tmp/work/cortexa53-crypto-poky-linux/opencv/4.5.5-r0/git存在objdetect.hpp文件
    • 但是在tmp/work/cortexa53-crypto-poky-linux/opencv/4.5.5-r0/image/usr/include/opencv4/opencv2下未发现
    • 所以猜测是该module未被安装/编译
  • 查找BUILD_opencv_objdectet
    /tmp/work/cortexa53-crypto-poky-linux/opencv/4.5.5-r0$ grep -rn 'BUILD_opencv_obj'
    git/cmake/vars/OPENCV_DISABLE_THREAD_SUPPORT.cmake:24:ocv_update(BUILD_opencv_objdetect OFF)
    git/platforms/wince/readme.md:30:-DBUILD_opencv_objdetect=OFF `
    build/CMakeVars.txt:65:BUILD_opencv_objc_bindings_generator=ON
    build/CMakeVars.txt:66:BUILD_opencv_objdetect=ON
    build/CMakeCache.txt:189:BUILD_opencv_objc_bindings_generator:BOOL=ON
    build/CMakeCache.txt:192:BUILD_opencv_objdetect:BOOL=ON
    
    • build/CMakeVars.txt和build/CMakeCache.txt中的BUILD_opencv_objdetect均为ON
    • 查看git/cmake/vars/OPENCV_DISABLE_THREAD_SUPPORT.cmake
      # Force removal of code conditionally compiled with `#if
      # HAVE_PTHREAD`.
      ocv_update(HAVE_PTHREAD 0)
      ...
      # These modules require `#include
      # <[thread|mutex|condition_variable|future]>` and linkage into
      # `libpthread` to work.
      ocv_update(BUILD_opencv_objdetect OFF)
      ocv_update(BUILD_opencv_gapi OFF)
      ocv_update(BUILD_opencv_dnn OFF)
      
      
      • 按照错误3中的方法修改ocv_update(BUILD_opencv_objdetect OFF)ocv_update(BUILD_opencv_objdetect ON)。制作pathc,添加到*.append文件中
      • 测试发现,该方案无效。产物中还是没有objdetect module相关产物
  • 解决
    • 猜测出现该问题原因为opencv_objdectet模块缺少某些依赖模块(debug发现dnn关联性较大)
    • append文件中显式编译dnn模块
      PACKAGECONFIG = "eigen jpeg png tbb dnn"           ##显式指定编译某些模块
      PACKAGES:remove = "${PN}-samples ${PN}-java python-opencv python3-opencv"
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值