【问题标题】:How to build OpenCV for Android using libc++ STL library?如何使用 libc++ STL 库为 Android 构建 OpenCV?
【发布时间】:2014-12-10 09:20:44
【问题描述】:

我想使用 libc++ STL 库而不是默认的 GNU STL 从源代码构建 OpenCV。 LibC++ 提供更好的 C++11 和 C++14 支持。有可能吗?

【问题讨论】:

    标签: opencv stl android-ndk libc++


    【解决方案1】:

    我已经使用 OpenCV 2.4.7 和 Android NDK r10d 对此进行了测试。

    首先,您需要下载OpenCV source。解压源码,将platforms/android/android.toolchain.cmake替换为version that suppports libc++

    现在,打开 modules/core/include/opencv2/core/operations.hpp 并将第 69 行从

    (defined __GNUC__ && defined _STLPORT_MAJOR)
    

    (defined __GNUC__ && (defined _STLPORT_MAJOR || defined _LIBCPP_VERSION))
    

    接下来,在文件夹platforms/scripts中创建一个脚本cmake_android_arm_libcxx.sh,内容如下:

    #!/bin/sh
    cd `dirname $0`/..
    
    mkdir -p build_android_arm
    cd build_android_arm
    
    cmake -DANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-4.8 -DANDROID_STL=c++_static -DANDROID_NATIVE_API_LEVEL=android-8 -DBUILD_ANDROID_EXAMPLES=OFF -DBUILD_DOCS=OFF -DBUILD_FAT_JAVA_LIB=OFF -DBUILD_JASPER=OFF -DBUILD_OPENEXR=OFF -DBUILD_PACKAGE=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_TESTS=OFF -DBUILD_TIFF=OFF -DBUILD_WITH_DEBUG_INFO=OFF -DBUILD_opencv_androidcamera=OFF -DBUILD_opencv_contrib=OFF -DBUILD_opencv_java=OFF -DBUILD_opencv_legacy=OFF -DBUILD_opencv_ml=OFF -DBUILD_opencv_nonfree=OFF -DBUILD_opencv_objdetect=OFF -DBUILD_opencv_photo=OFF -DBUILD_opencv_stitching=OFF -DBUILD_opencv_ts=OFF -DBUILD_opencv_video=OFF -DBUILD_opencv_videostab=OFF -DCMAKE_C_FLAGS_RELEASE="-Os -DNDEBUG -fvisibility=hidden -ffunction-sections -fstack-protector-all" -DCMAKE_CXX_FLAGS_RELEASE="-Os -DNDEBUG -fvisibility=hidden -ffunction-sections -fstack-protector-all -fvisibility-inlines-hidden" -DENABLE_PRECOMPILED_HEADERS=OFF -DWITH_EIGEN=OFF -DWITH_JASPER=OFF -DWITH_OPENEXR=OFF -DWITH_TIFF=OFF -DWITH_TBB=ON -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON -DCMAKE_TOOLCHAIN_FILE=../android/android.toolchain.cmake $@ ../..
    

    如果需要,您可以调整脚本的参数(即构建什么以及如何构建)。

    最后,导出 NDK 构建文件夹的路径

    export ANDROID_NDK=~/android-sdks/android-ndk-r10d/
    

    并执行脚本:

     sh ./scripts/cmake_android_arm_libcxx.sh 
    

    现在进入build_android_arm文件夹并构建OpenCV:

    cd build_android_arm
    make -j9
    

    libjpeg、libpng 等第三方库会出现在platforms/build_android_arm/3rdparty/lib,opencv 库会出现在platforms/build_android_arm/lib 文件夹中。

    这已在 Mac OS X 10.10、OpenCV 2.4.7 和 Android NDK r10d 上进行了测试。

    【讨论】:

    • 您是否已将您的项目更新到 OpenCV 3?那条线已经不存在了。
    • 还没有,但计划下周或后周有一个。原因是最近发布的 NDK r11 弃用了 GCC 和 stdc++,转而支持 Clang 和 libc++。
    • @JoseUrbanoDuarteJunior,我用 clang 和 libc++ 构建了 OpenCV 3.0,没有对代码进行任何修改。我只是开箱即用(无需修改operations.hpp
    • 我忘了说你需要使用 NDK r10e,因为在 r11 中文件夹的结构发生了变化,所以 android cmake 工具链不再起作用。但是,有一个workaround for this
    • 你为 MIPS 编译了吗?你能发布一下你是怎么做到的吗?
    【解决方案2】:

    这是我用 clang 和 libc++ 为 arm64 构建 OpenCV 3.0 的脚本(对于其他 ABI,只需更改工具链名称):

    #!/bin/sh
    
    export ANDROID_NDK=~/android-sdks/android-ndk
    cmake -DANDROID_TOOLCHAIN_NAME=aarch64-linux-android-clang3.5 -DANDROID_STL=c++_static -DANDROID_ABI="arm64-v8a" -DANDROID_NATIVE_API_LEVEL=android-8 -DBUILD_ANDROID_EXAMPLES=OFF -DBUILD_DOCS=OFF -DBUILD_FAT_JAVA_LIB=OFF -DBUILD_JASPER=OFF -DBUILD_OPENEXR=OFF -DBUILD_PACKAGE=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_TESTS=OFF -DBUILD_TIFF=ON -DBUILD_WITH_DEBUG_INFO=OFF -DBUILD_opencv_apps=OFF -DBUILD_opencv_java=OFF -DBUILD_opencv_python2=OFF -DBUILD_opencv_world=OFF -DCMAKE_C_FLAGS_RELEASE="-Os -DNDEBUG -fvisibility=hidden -ffunction-sections -fstack-protector-all" -DCMAKE_CXX_FLAGS_RELEASE="-Os -DNDEBUG -fvisibility=hidden -ffunction-sections -fstack-protector-all -fvisibility-inlines-hidden" -DENABLE_PRECOMPILED_HEADERS=OFF -DWITH_EIGEN=OFF -DWITH_JASPER=OFF -DWITH_OPENEXR=OFF -DWITH_TIFF=ON -DWITH_TBB=ON -DWITH_CUDA=OFF -DWITH_CUFFT=OFF -DWITH_WEBP=OFF -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON -DCMAKE_TOOLCHAIN_FILE=$1/platforms/android/android.toolchain.cmake $1
    

    【讨论】:

    • 你从哪里得到aarch64-linux-android-clang3.5?如果您构建了它,那么您可以发布构建步骤吗?
    • IIRC,它是有问题的 NDK 发行版中现有 clang 二进制文件的符号链接 - 只是为了欺骗 OpenCV 工具链,使其认为存在新版本的 clang。但由于 NDK 提供了自己的官方 cmake 工具链,我使用它来构建 OpenCV。
    猜你喜欢
    • 2018-07-11
    • 2021-11-14
    • 2015-08-11
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    相关资源
    最近更新 更多