【问题标题】:Opencv 4.1.1 Android Linking errorsOpencv 4.1.1 Android 链接错误
【发布时间】:2019-12-17 15:38:57
【问题描述】:

我有一个用 OpenCV 用 C++ 编写的应用程序,用于 Android SDK。目前我们正在使用 OpenCV 3.2.0,但我们需要迁移到 OpenCV 4.1.1。我正在尝试为不同架构使用更少的模块来构建它。

我使用的是 Opencv 4.1.1; ndk 16b; cmake 3.13.2

这是命令行

cmake \ -DANDROID_ABI:STRING=$currentArch \ -DANDROID_TOOLCHAIN_NAME:STRING=$currentArchVersion \ -D ANDROID_NDK:PATH="/Users/analivia/Library/Android/sdk/ndk-bundle" \ -D ANDROID_NDK_HOST_X64:BOOL="1" \ -D ANDROID_NATIVE_API_LEVEL=24 \ -D ANDROID_TOOLCHAIN=clang \ -D ANDROID_STL=c++_static \ -D CMAKE_TOOLCHAIN_FILE:FILEPATH="/Users/analivia/Library/Android/sdk/ndk-bundle/build/cmake/android.toolchain.cmake" \ -D CMAKE_CXX_FLAGS_MINSIZEREL:STRING="-Os -ffunction-sections -fdata-sections -Wl,--gc-sections -D NDEBUG" \ -D CMAKE_CXX_FLAGS_RELEASE:STRING="-Os -ffunction-sections -fdata-sections -Wl,--gc-sections -D NDEBUG" \ -D CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING="-Os -g -D NDEBUG" \ -D CMAKE_C_FLAGS_RELEASE:STRING="-Os -ffunction-sections -fdata-sections -Wl,--gc-sections -D NDEBUG" \ -D BUILD_ANDROID_EXAMPLES:BOOL="0" \ -D BUILD_opencv_video:BOOL="0" \ -D BUILD_WITH_DEBUG_INFO:BOOL="0" \ -D WITH_JASPER:BOOL="0" \ -D WITH_JPEG:BOOL="1" \ -D BUILD_opencv_photo:BOOL="0" \ -D BUILD_opencv_videoio:BOOL="0" \ -D BUILD_opencv_ts:BOOL="0" \ -D WITH_CAROTENE:BOOL="0" \ -D BUILD_opencv_stitching:BOOL="0" \ -D CMAKE_C_FLAGS:STRING="" \ -D BUILD_FAT_JAVA_LIB:BOOL="0" \ -D BUILD_OPENEXR:BOOL="0" \ -D BUILD_PERF_TESTS:BOOL="0" \ -D BUILD_opencv_videostab:BOOL="0" \ -D WITH_EIGEN:BOOL="0" \ -D BUILD_JASPER:BOOL="0" \ -D WITH_TBB:BOOL="1" \ -D WITH_IPP:BOOL="0" \ -D WITH_WEBP:BOOL="0" \ -D BUILD_opencv_superres:BOOL="0" \ -D BUILD_opencv_shape:BOOL="0" \ -D BUILD_opencv_dnn:BOOL="1" \ -D BUILD_PACKAGE:BOOL="0" \ -D BUILD_TESTS:BOOL="0" \ -D WITH_OPENEXR:BOOL="0" \ -D WITH_CUDA:BOOL="0" \ -D WITH_CUFFT:BOOL="0" \ -D BUILD_PNG:BOOL="1" \ -D BUILD_JPEG:BOOL="1" \ -D BUILD_DOCS:BOOL="0" \ -D BUILD_TIFF:BOOL="0" \ -D WITH_PNG:BOOL="1" \ $opencvSource

我添加到 Android 项目,但我得到很多未定义的 opencv 函数引用

Android Studio 使用 cmake 3.10.2

例子:

error: undefined reference to 'cv::cvtColor(cv::_InputArray const&, cv::_OutputArray const&, int, int)' error: undefined reference to 'cv::extractChannel(cv::_InputArray const&, cv::_OutputArray const&, int)' error: undefined reference to 'cv::Mat::copyTo(cv::_OutputArray const&) const'

【问题讨论】:

    标签: android opencv cmake


    【解决方案1】:

    我最终使用 gcc 作为编译器,使用 gnustatic 作为 STL 和 opencv 的工具链。 这是最后的命令

    cmake \
        -DANDROID_ABI:STRING=$currentArch \
        -DANDROID_TOOLCHAIN_NAME:STRING=$currentArchVersion \
        -D ANDROID_NDK:PATH="/Users/analivia/Library/Android/sdk/ndk-bundle" \
        -D ANDROID_NDK_HOST_X64:BOOL="1" \
        -D ANDROID_NATIVE_API_LEVEL=24 \
        -D ANDROID_SDK_ROOT:PATH="/Users/analivia/Library/Android/sdk" \
        -D CMAKE_TOOLCHAIN_FILE:FILEPATH="$opencvSource/platforms/android/android.toolchain.cmake" \
        -D CMAKE_CXX_FLAGS_MINSIZEREL:STRING="-Os -ffunction-sections -fdata-sections -Wl,--gc-sections -D NDEBUG" \
        -D CMAKE_CXX_FLAGS_RELEASE:STRING="-Os -ffunction-sections -fdata-sections -Wl,--gc-sections -D NDEBUG" \
        -D CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING="-Os -g -D NDEBUG" \
        -D CMAKE_C_FLAGS_RELEASE:STRING="-Os -ffunction-sections -fdata-sections -Wl,--gc-sections -D NDEBUG" \
        -D BUILD_ANDROID_EXAMPLES:BOOL="0" \
        -D BUILD_opencv_video:BOOL="0" \
        -D BUILD_WITH_DEBUG_INFO:BOOL="0" \
        -D WITH_JASPER:BOOL="0" \
        -D WITH_JPEG:BOOL="1" \
        -D BUILD_opencv_photo:BOOL="0" \
        -D BUILD_opencv_videoio:BOOL="0" \
        -D BUILD_opencv_ts:BOOL="0" \
        -D WITH_CAROTENE:BOOL="0" \
        -D BUILD_opencv_stitching:BOOL="0" \
        -D CMAKE_C_FLAGS:STRING="" \
        -D BUILD_FAT_JAVA_LIB:BOOL="1" \
        -D BUILD_OPENEXR:BOOL="0" \
        -D BUILD_PERF_TESTS:BOOL="0" \
        -D BUILD_opencv_videostab:BOOL="0" \
        -D WITH_EIGEN:BOOL="0" \
        -D BUILD_JASPER:BOOL="0" \
        -D WITH_TBB:BOOL="1" \
        -D WITH_IPP:BOOL="0" \
        -D WITH_WEBP:BOOL="0" \
        -D BUILD_opencv_superres:BOOL="0" \
        -D BUILD_opencv_shape:BOOL="0" \
        -D BUILD_PACKAGE:BOOL="0" \
        -D BUILD_TESTS:BOOL="0" \
        -D WITH_OPENEXR:BOOL="0" \
        -D WITH_CUDA:BOOL="0" \
        -D WITH_CUFFT:BOOL="0" \
        -D BUILD_PNG:BOOL="1" \
        -D BUILD_JPEG:BOOL="1" \
        -D BUILD_DOCS:BOOL="0" \
        -D BUILD_TIFF:BOOL="0" \
        -D WITH_PNG:BOOL="1" \
    

    【讨论】:

    • 嗨,安娜,我遇到了类似的问题,您能详细说明您的方法吗?你为什么采取这种方式?
    • 嗨罗密欧,我发现我使用 opencv 的 android 本机库需要使用 gcc 和 gnustatic 构建,并且显然使用不同的编译器和 STL 来构建 opencv,当我使用时我的库导致链接错误两者都一样,它有效。
    猜你喜欢
    • 2014-03-26
    • 1970-01-01
    • 2018-04-16
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    相关资源
    最近更新 更多