• 使用自己编译的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。至于如何做到和官方一样,目前没找到方法。

  • 相关阅读:
    codeforces Wunder Fund Round 2016 (Div. 1 + Div. 2 combined) C. Constellation
    codeforces Wunder Fund Round 2016 (Div. 1 + Div. 2 combined) B Guess the Permutation
    codeforces Wunder Fund Round 2016 (Div. 1 + Div. 2 combined) A Slime Combining(栈)
    在服务器IIS中添加新网站后打开网站需要用户名和密码时怎么办?
    简易通讯录
    先列出所有数据库,再删除其中一个数据库。
    数据库创建mysql_query($sql,$link)
    显示所有数据库 mysql_fetch_object()
    读取数据库数据
    PHP警告错误处理办法
  • 原文地址:https://www.cnblogs.com/willhua/p/12519482.html
Copyright © 2020-2023  润新知