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.4
和libopencv_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.405
而libblade_runner.so.1.1.3
需要的NEEDED
为libopencv_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_SOVERSION
为ocv_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相关产物
- 按照错误3中的方法修改
- 解决
- 猜测出现该问题原因为
opencv_objdectet
模块缺少某些依赖模块(debug发现dnn关联性较大) - 在
append
文件中显式编译dnn
模块PACKAGECONFIG = "eigen jpeg png tbb dnn" ##显式指定编译某些模块 PACKAGES:remove = "${PN}-samples ${PN}-java python-opencv python3-opencv"
- 猜测出现该问题原因为