在 Qt Android 项目中使用 OpenCV 时的链接顺序 [重复]

Posted

技术标签:

【中文标题】在 Qt Android 项目中使用 OpenCV 时的链接顺序 [重复]【英文标题】:Link-order when using OpenCV in Qt Android project [duplicate] 【发布时间】:2014-12-17 14:49:50 【问题描述】:

我正在尝试在从 Qt Creator 构建的 Qt android 项目中使用 OpenCV。

我使用预先构建的OpenCV-2.4.10-android-sdk,从它们的大小来看,我正在链接到静态库。现在我遇到了链接器错误,并且由于 GCC 中的链接顺序很重要,我怀疑这是因为我的链接顺序不正确(库按字母顺序排列)。

考虑到我在 Windows 上进行交叉编译,那么正确的链接顺序是什么?如何找到它?

这是来自我的 .pro 文件:

LIBS += -L"c:/Workspace/OpenCV-2.4.10-android-sdk/sdk/native/libs/armeabi-v7a"\
        -L"c:/Workspace/OpenCV-2.4.10-android-sdk/sdk/native/3rdparty/libs/armeabi-v7a"
LIBS += \
    -lopencv_core\
    -lopencv_features2d\
    -lopencv_flann\
    -lopencv_highgui\
    -lopencv_imgproc\
    -lopencv_legacy\
    -lopencv_ml\
    -lopencv_objdetect\
    -lopencv_ocl\
    -lopencv_photo\
    -lopencv_stitching\
    -lopencv_superres\
    -lopencv_ts\
    -lopencv_video\
    -lopencv_videostab\
    -lIlmImf\
    -llibjasper\
    -llibjpeg\
    -llibpng\
    -llibtiff\
    -ltbb

这是我现在收到的错误:

c:/Workspace/OpenCV-2.4.10-android-sdk/sdk/native/libs/armeabi-v7a/libopencv_core.a(parallel.cpp.o):parallel.cpp:function tbb::interface6::internal::start_for<tbb::blocked_range<int>, (anonymous namespace)::ProxyLoopBody, tbb::auto_partitioner const>::~start_for(): error: undefined reference to 'vtable for tbb::task'

【问题讨论】:

【参考方案1】:

对于任何可能有同样问题的人,这是 OpenCV 的正确顺序。我在c:\Workspace\OpenCV-2.4.10-android-sdk\sdk\native\jni\OpenCVModules_armeabi_v7a.cmake找到它:

foreach(_expectedTarget libtiff libjpeg libjasper libpng IlmImf tbb opencv_core opencv_androidcamera opencv_flann opencv_imgproc opencv_highgui opencv_features2d opencv_calib3d opencv_ml opencv_objdetect opencv_video opencv_contrib opencv_photo opencv_java opencv_legacy opencv_ocl opencv_stitching opencv_superres opencv_ts opencv_videostab)

当按照foreach 中给出的顺序编译时,它们可以工作。我找不到任何可以为我提供正确顺序的工具,至少对于 Windows 上的 Android NDK 来说不是。

这就是 LIBS 条目的外观:

LIBS += -L"c:/Workspace/OpenCV-2.4.10-android-sdk/sdk/native/libs/armeabi-v7a"\
        -L"c:/Workspace/OpenCV-2.4.10-android-sdk/sdk/native/3rdparty/libs/armeabi-v7a"
LIBS += \
    -llibtiff\
    -llibjpeg\
    -llibjasper\
    -llibpng\
    -lIlmImf\
    -ltbb\
    -lopencv_core\
    -lopencv_androidcamera\
    -lopencv_flann\
    -lopencv_imgproc\
    -lopencv_highgui\
    -lopencv_features2d\
    -lopencv_calib3d\
    -lopencv_ml\
    -lopencv_objdetect\
    -lopencv_video\
    -lopencv_contrib\
    -lopencv_photo\
    -lopencv_java\
    -lopencv_legacy\
    -lopencv_ocl\
    -lopencv_stitching\
    -lopencv_superres\
    -lopencv_ts\
    -lopencv_videostab

【讨论】:

以上是关于在 Qt Android 项目中使用 OpenCV 时的链接顺序 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

是否可以为 android 编译 Qt+QML+OpenCV 应用程序

qt Android中使用opencv处理视频

Qt 和 opencv4android

QT Widget使用OpenCV错误部署到Android [重复]

Qt - OpenCV在项目中集成使用(待完成)

在win和android上同时进行OpenCV程序设计