zoukankan      html  css  js  c++  java
  • 使用自己编译的OpenCV时链接zlib失败

    使用自己编译的OpenCV时,发现如下错误:

    C:/Android/AndroidSDK/ndk/20.1.5948944/build//../toolchains/llvm/prebuilt/windows-x86_64/bin/../lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/binld: cannot find -lC:/Android/AndroidSDK/ndk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/aarch64-linux-android/libz.a
    clang++: error: linker command failed with exit code 1 (use -v to see invocation)
    make: *** [C:/Android/Projects/vscode/androidTest/obj/local/arm64-v8a/testpro] Error 1
    

    通过查看安装好的OpenCV发现,在OpenCV-arm-v8a.mk文件中

    OPENCV_3RDPARTY_COMPONENTS:=tbb cpufeatures libprotobuf libjpeg-turbo libwebp libpng libtiff libjasper IlmImf quirc tegra_hal
    OPENCV_EXTRA_COMPONENTS:=C:/Android/AndroidSDK/ndk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/aarch64-linux-android/libz.a dl m log
    

    发现libz是固定路径的,即依赖编译时指定的NDK路径。

    OPENCV_3RDPARTY_COMPONENTS:=tbb cpufeatures libprotobuf libjpeg-turbo libwebp libpng libtiff libjasper IlmImf quirc tegra_hal
    OPENCV_EXTRA_COMPONENTS:=C:/Android/AndroidSDK/ndk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/aarch64-linux-android/libz.a dl m log
    

    同时,对比官方的SDK,发现

    OPENCV_3RDPARTY_COMPONENTS:=tbb cpufeatures libprotobuf libjpeg-turbo libwebp libpng libtiff libjasper IlmImf quirc tegra_hal
    OPENCV_EXTRA_COMPONENTS:=z dl m log
    

    假如我们手动把我们自己编译的SDK中的OPENCV_EXTRA_COMPONENTS改成和官方的一样,确实可以编译过。但是这样不方便,每次编译自己的SDK之后都需要手动修改。于是查看编译目录下面,发现CMakeVars.txt中含有OPENCV_EXTRA_COMPONENTS=C:/Android/AndroidSDK/ndk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/aarch64-linux-android/libz.a;dl;m;log. 为什么dl;m;log没有指定绝对路径呢?然后查看CMakeLists.txt,发现有OCV_OPTION(BUILD_ZLIB "Build zlib from source" (WIN32 OR APPLE OR OPENCV_FORCE_3RDPARTY_BUILD) ),但是没有BUILD_DLLIB这样的选项,说明libz比较特殊。然后在CMakeCache.txt中发现BUILD_ZLIB:BOOL=OFF //Build zlib from source,同时也没有发现BUILD_DLLIB这样的。显然,我们可以通过自己编译libz来解决这种绝对路径依赖问题,于是我们在编译命令中加入BUILD_ZLIB:BOOL=ON命令,顺利的解决问题了。但是还是和官方的有所区别,自己编译的zlib是作为3rdparty库了,而官方的和dl一样,是作为extra component。至于如何做到和官方一样,目前没找到方法。

  • 相关阅读:
    Hive学习小记-(4)带复杂集合类型及指定多分隔符hive建表
    nowcoder-shell篇(grep、awk、sed为主)
    剑指offer02-替换空格
    剑指offer67-剪绳子**
    爬虫5-Scrapy爬虫架构
    爬虫4-网站结构分析
    爬虫3-python爬取非结构化数据下载到本地
    项目创建
    项目框架搭建
    项目表结构
  • 原文地址:https://www.cnblogs.com/willhua/p/12519482.html
Copyright © 2011-2022 走看看