在Qt Android项目中使用OpenCV时的链接顺序

Link-order when using OpenCV in Qt Android project

本文关键字:OpenCV 链接 顺序 Qt Android 项目      更新时间:2023-10-16

我正在尝试在从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'

对于任何可能遇到相同问题的人来说,这是OpenCV的正确顺序。我在c:WorkspaceOpenCV-2.4.10-android-sdksdknativejniOpenCVModules_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