caffe2编译android库,使用CMake交叉编译Android环境的OpenCV

本文档详细记录了在Ubuntu 16.04上使用CMake交叉编译Android版OpenCV 4.1.1时遇到的错误以及解决方案。主要问题在于使用Android NDK r18b编译时出现链接错误,通过添加-DBUILD_ZLIB=ON参数解决。同时,文章提供了完整的编译步骤、环境配置和关键的cmake参数,包括设置ANDROID_NDK_HOME、ANDROID_SDK、CMAKE_TOOLCHAIN_FILE等,并展示了编译过程和生成的库文件位置。
摘要由CSDN通过智能技术生成

编译环境

这一点十分重要,有时候如果环境不同,可能出现一些奇奇怪怪的错误,会浪费大量的时间去填坑。

比如我用>Android NDK r18b版本编译,就报错:

针对这个报错,我提了一个issues:https://github.com/opencv/opencv/issues/15521

不知道以后会不会解决。

解决了:

如果使用>Android NDK r18b编译,需要添加下面的参数:

-DBUILD_ZLIB=ON

[ 57%] Linking CXX shared library ../../lib/armeabi-v7a/libopencv_core.so

bionic/libc/include/bits/fortify/stdio.h:70: error: undefined reference to '__vsnprintf_chk'

bionic/libc/include/bits/fortify/stdio.h:43: error: undefined reference to '__vsnprintf_chk'

clang++: error: linker command failed with exit code 1 (use -v to see invocation)

modules/core/CMakeFiles/opencv_core.dir/build.make:1345: recipe for target 'lib/armeabi-v7a/libopencv_core.so' failed

make[2]: *** [lib/armeabi-v7a/libopencv_core.so] Error 1

CMakeFiles/Makefile2:1509: recipe for target 'modules/core/CMakeFiles/opencv_core.dir/all' failed

make[1]: *** [modules/core/CMakeFiles/opencv_core.dir/all] Error 2

make[1]: *** Waiting for unfinished jobs....

[ 57%] Linking CXX static library ../lib/armeabi-v7a/libIlmImf.a

[ 57%] Built target IlmImf

Makefile:162: recipe for target 'all' failed

make: *** [all] Error 2

Ubuntu 16.04 LTS 64-bit

cmake 3.13.4

Android SDK

针对Android SDK我感觉没什么特别要求,从API Level 22 到 29我都安装了。

550c85024c49

image.png

配置环境变量

上面东西都准备好之后,我们还需要配置一下环境变量:

在 ~/.bashrc 中添加:

export ANDROID_HOME=/home/andforce/Android/Sdk

export ANDROID_SDK=$ANDROID_HOME

export ANDROID_NDK_HOME=/home/andforce/Downloads/android-ndk-r17c

export ANDROID_NDK=$ANDROID_NDK_HOME

开始编译

解压下载的OpenCV 4.1.1源码,进入源码目录后:

$ tree -L 1

.

├── 3rdparty

├── apps

├── cmake

├── CMakeLists.txt

├── CONTRIBUTING.md

├── data

├── doc

├── include

├── LICENSE

├── modules

├── platforms

├── README.md

└── samples

9 directories, 4 files

创建存放编译结果的目录

$mkdir build

进入build目录开始编译:

$cd build

# 开始执行 cmake 编译命令

# 注意有【..】,表示源码目录在上一层,因为我们现在是在build目录

cmake .. -DINSTALL_ANDROID_EXAMPLES=OFF \

-DANDROID_EXAMPLES_WITH_LIBS=OFF \

-DBUILD_EXAMPLES=OFF \

-DBUILD_DOCS=OFF \

-DWITH_OPENCL=OFF \

-DWITH_IPP=ON \

-DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK_HOME}/build/cmake/android.toolchain.cmake \

-DANDROID_TOOLCHAIN=clang \

-DANDROID_STL=c++_shared \

-DBUILD_SHARED_LIBS=ON \

-DBUILD_ANDROID_PROJECTS=OFF \

-DBUILD_ANDROID_EXAMPLES=OFF \

-DBUILD_PREF_TESTS=OFF \

-DBUILD_TESTS=OFF \

-DANDROID_ABI=armeabi-v7a \

-DANDROID_SDK_TARGET=21

几个重要的参数含义

#NDK中toolchain的路径

-DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK_HOME}/build/cmake/android.toolchain.cmake

#toolchain是clang版本

-DANDROID_TOOLCHAIN=clang

#表示编译出的是.a静态库,如果要编译.so动态库,配置成c++_shared就可以了

-DANDROID_STL=c++_static

#不编译Android工程

-DBUILD_ANDROID_PROJECTS=OFF

#不编译事例工程

-DBUILD_ANDROID_EXAMPLES=OFF

#不编译PREF test

-DBUILD_PREF_TESTS=OFF

#不编译test

-DBUILD_TESTS=OFF

#android abi,x86,x86_64等

-DANDROID_ABI=armeabi-v7a

#Android target sdk

-DANDROID_SDK_TARGET=21

也许你有别的cmake参数想修改?

首先得知道支持哪些参数,在执行完上面的cmake命令之后,在build目录执行:

cmake -LA .

可以看到,有很多很多的参数,请根据自己的情况选择吧。

ANDROID_EXAMPLES_WITH_LIBS:BOOL=OFF

BUILD_ANDROID_EXAMPLES:BOOL=OFF

BUILD_ANDROID_PROJECTS:BOOL=OFF

BUILD_ANDROID_SERVICE:BOOL=OFF

BUILD_CUDA_STUBS:BOOL=OFF

BUILD_DOCS:BOOL=OFF

BUILD_EXAMPLES:BOOL=OFF

BUILD_FAT_JAVA_LIB:BOOL=ON

BUILD_ITT:BOOL=ON

BUILD_JASPER:BOOL=ON

BUILD_JAVA:BOOL=ON

BUILD_JPEG:BOOL=ON

BUILD_LIST:STRING=

BUILD_OPENEXR:BOOL=ON

BUILD_PACKAGE:BOOL=ON

BUILD_PERF_TESTS:BOOL=ON

BUILD_PNG

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值