编译环境
这一点十分重要,有时候如果环境不同,可能出现一些奇奇怪怪的错误,会浪费大量的时间去填坑。
比如我用>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我都安装了。
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