【发布时间】:2014-12-10 09:20:44
【问题描述】:
我想使用 libc++ STL 库而不是默认的 GNU STL 从源代码构建 OpenCV。 LibC++ 提供更好的 C++11 和 C++14 支持。有可能吗?
【问题讨论】:
标签: opencv stl android-ndk libc++
我想使用 libc++ STL 库而不是默认的 GNU STL 从源代码构建 OpenCV。 LibC++ 提供更好的 C++11 和 C++14 支持。有可能吗?
【问题讨论】:
标签: opencv stl android-ndk libc++
我已经使用 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 上进行了测试。
【讨论】:
operations.hpp。
这是我用 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
【讨论】: