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

你可能感兴趣的:(使用自己编译的OpenCV时链接zlib失败)