【问题标题】:OpenCV undefined reference to `cv::fastFree(void*)'OpenCV 未定义对 `cv::fastFree(void*)' 的引用
【发布时间】:2016-03-23 09:20:23
【问题描述】:

我尝试使用 OpenCV 构建项目,我从官方网站下载了 OpenCV SDK 3.1,但是在构建过程中出现错误

/Users/Mario/Downloads/OpenCV-android-sdk/sdk/native/jni/include/opencv2/core/mat.inl.hpp
Error:(571) undefined reference to 'cv::fastFree(void*)'
Error:(663) undefined reference to 'cv::Mat::create(int, int const*, int)'
Error:(682) undefined reference to 'cv::Mat::deallocate()'

这是我的 gradle.build,我使用 gradle-experimental:0.4.0

apply plugin: 'com.android.model.application'
model {
android {
    compileSdkVersion = 23
    buildToolsVersion = "23.0.2"

    defaultConfig.with {
        applicationId = "pl.mariusz.opencv"
        minSdkVersion.apiLevel = 17
        targetSdkVersion.apiLevel = 23
        versionCode = 1
        versionName = "1.0"
    }

    task ndkBuild(type: Exec) {
        commandLine '/Users/Mario/Library/Android/android-ndk-r10e/ndk-build', '-C', file('src/main').absolutePath
    }

    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn ndkBuild
    }
}
android.ndk {
    moduleName = "source_file"

    cppFlags.add("-std=c++11")
    cppFlags.add("-fexceptions")
    cppFlags.add("-I${file("/Users/Mario/Downloads/OpenCV-android-sdk/sdk/native/jni/include")}".toString())
    cppFlags.add("-I${file("/Users/Mario/Downloads/OpenCV-android-sdk/sdk/native/jni/include/opencv")}".toString())

    stl = "gnustl_static"//"gnustl_static"//"gnustl_shared"//"stlport_static"
}

android.sources {
    main {
        jni{
            source{
                srcDirs = []
            }
        }
        jniLibs {
            source {
                srcDirs = ['src/main/Libs']
            }

        }
    }
}
android.buildTypes {
    release {
        minifyEnabled = false
        proguardFiles.add(file('proguard-rules.txt'))
    }
}

}

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

OPENCVROOT:= /Users/Mario/Downloads/OpenCV-android-sdk
OPENCV_LIB_TYPE=STATIC
include ${OPENCVROOT}/sdk/native/jni/OpenCV.mk

LOCAL_SRC_FILES  := source_file.cpp
LOCAL_LDLIBS += -llog -ldl
LOCAL_MODULE := source_file

include $(BUILD_SHARED_LIBRARY)

和 Application.mk

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_PLATFORM := android-17

我尝试将它与共享的静态 STL 混合,但仍然出现相同的错误,我该如何解决?

[编辑]

[解决方案]

它更像是妥协而不是真正的解决方案,但我将 gradle-experimental:0.4.0 改回 classpath 'com.android.tools.build:gradle:1.5.0' 并将文件 gradle.properties 添加到项目根目录中

android.useDeprecatedNdk=true

【问题讨论】:

  • 您必须将 opencv 库添加到链接器中,例如 LOCAL_LDLIBS += -llog -ldl -lopencv_core -lopencv_features2d 等。不确定它们的确切名称是什么。
  • Error:error: cannot find -lopencv_core 尝试使用 -libopencv_core 和 -llibopencv_code 得到相同的结果,同样适用于 -lopencv_features2d
  • 你的 opencv 库文件的名称是什么,它们在你的系统中的什么位置?它们的名称应该类似于 libopencv_core.*
  • 我认为您需要将 OpenCV 库的路径添加到 LD_LIBRARY_PATH(链接器在其中搜索库)。
  • 同样的错误信息?您必须使用 -lopencv_... 版本,而不是 -llibopencv_... 等。我会写一个答案,我不能说它是否有效,所以请不要投反对票。在答案中调整建议比在 cmets 中更容易。

标签: android c++ opencv


【解决方案1】:

您必须将 opencv 库添加到您的链接器。为此,您必须做两件事: 1. 添加库文件; 2.添加库目录。

试试

LOCAL_LDLIBS += -llog -ldl -LlibPath -lopencv_calib3d -lopencv_core 

然后,以这种方式添加所有 opencv 库(或至少是您需要的库)。 -l 将自动假定文件名和后缀中的“lib”。 -L 将告诉链接器在哪里可以找到库,因此请添加您的 opencv 库文件夹的绝对路径,而不是 libPath。见how to mention path of libraries in Android.mk file or Application.mk file?

试试看,告诉我新的错误信息。

【讨论】:

  • LOCAL_LDLIBS += -llog -ldl -L/Users/Mario/AndroidStudioProjects/SteveAR/app/src/main/libs -lopencv_core 导致/Users/Mario/Library/Android/android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/arm-linux-androideabi/bin/ld Error:error: cannot find -lopencv_core,看起来它试图在 NDK 目录中查找 lib
  • 对不起,我没有 NDK 经验,但可以试试stackoverflow.com/questions/20397870/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
  • 2018-10-03
  • 1970-01-01
  • 2013-06-26
  • 1970-01-01
  • 2020-09-17
相关资源
最近更新 更多