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