使用自己編譯的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。至於如何做到和官方一樣,目前沒找到方法。