2015-09-08 3 views
1

Я пытаюсь использовать OpenCV в своем приложении на основе Qt. Однако по какой-то причине я сталкиваюсь с ошибками связи.Неразрешенные символы: Qt и OpenCV

Я использую Qt 5.5.0, MSVC 12.0, OpenCV 3.0, Windows 7. Мой OpenCV распакован в папке C: \ opencv. Я не пытаюсь самостоятельно скомпилировать библиотеку, просто используя то, что было в пакете. Как показано в приведенном ниже коде, я связываюсь с библиотеками, расположенными в папке vc12.

Я удалил весь мой код и сделал это на самом деле основным для устранения неполадок, поэтому у меня есть стартер по умолчанию проект QtWidget (с пустым экраном), к которому я добавил одну строки:

#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include <opencv2/core.hpp> 

MainWindow::MainWindow(QWidget *parent) : 
QMainWindow(parent), 
ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    cv::Mat M; 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

Если Я комментирую единственную команду openCV (cv :: Mat M;), код компилируется и запускается. С помощью этой линии настоящего времени я получаю две нерешенных ошибки символа:

mainwindow.obj:-1: error: LNK2019: unresolved external symbol "void __cdecl cv::fastFree(void *)" ([email protected]@@[email protected]) referenced in function "public: __cdecl cv::Mat::~Mat(void)" ([email protected]@@[email protected]) 
mainwindow.obj:-1: error: LNK2019: unresolved external symbol "public: void __cdecl cv::Mat::deallocate(void)" ([email protected]@[email protected]@QEAAXXZ) referenced in function "public: void __cdecl cv::Mat::release(void)" ([email protected]@[email protected]@QEAAXXZ) 

Я пробовал различные способы для статической линковки библиотек OpenCV, но я получаю те же ошибки (я всегда чистый, повторно запустить QMAKE, а затем снова -строить проект для каждой попытки). Вот что мой .pro файл выглядит прямо сейчас (я в конечном итоге добавив всю статическую LIBS в надежде, что это поможет - это не так):

QT  += core gui 

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 

TARGET = Test 
TEMPLATE = app 


SOURCES += main.cpp\ 
    mainwindow.cpp 

HEADERS += mainwindow.h 

FORMS += mainwindow.ui 

win32:CONFIG(release, debug|release): LIBS += -LC:/opencv/build/x86/vc12/staticlib \ 
-lopencv_core300 \ 
-lopencv_highgui300 \ 
-lopencv_imgproc300 \ 
-lIlmImf \ 
-lippicvmt \ 
-llibjasper \ 
-llibjpeg \ 
-llibpng \ 
-llibtiff \ 
-llibwebp \ 
-lopencv_calib3d300 \ 
-lopencv_features2d300 \ 
-lopencv_flann300 \ 
-lopencv_hal300 \ 
-lopencv_imgcodecs300 \ 
-lopencv_ml300 \ 
-lopencv_objdetect300 \ 
-lopencv_photo300 \ 
-lopencv_shape300 \ 
-lopencv_stitching300 \ 
-lopencv_superres300 \ 
-lopencv_ts300 \ 
-lopencv_video300 \ 
-lopencv_videoio300 \ 
-lopencv_videostab300 \ 
-lzlib 

else:win32:CONFIG(debug, debug|release): LIBS += -LC:/opencv/build/x86/vc12/staticlib \ 
-lopencv_core300d \ 
-lopencv_highgui300d \ 
-lopencv_imgproc300d \ 
-lIlmImfd \ 
-lippicvmt \ 
-llibjasperd \ 
-llibjpegd \ 
-llibpngd \ 
-llibtiffd \ 
-llibwebpd \ 
-lopencv_calib3d300d \ 
-lopencv_features2d300d \ 
-lopencv_flann300d \ 
-lopencv_hal300d \ 
-lopencv_imgcodecs300d \ 
-lopencv_ml300d \ 
-lopencv_objdetect300d \ 
-lopencv_photo300d \ 
-lopencv_shape300d \ 
-lopencv_stitching300d \ 
-lopencv_superres300d \ 
-lopencv_ts300d \ 
-lopencv_video300d \ 
-lopencv_videoio300d \ 
-lopencv_videostab300d \ 
-lzlibd 

INCLUDEPATH += C:/opencv/build/include/ 

DEPENDPATH += C:/opencv/build/include/ 

Есть ли что-то, в частности, я пропускаю о конфигурации? Я уверен, что базовый синтаксис (например, слэши и т. Д.) В порядке, так как мне удалось связать другую библиотеку в Qt Creator в другом проекте, но я буду более чем счастлив попробовать любые предложения на этом этапе.

+0

Вы сами создали OpenCV? Если нет, то вы загрузили двоичный файл OpenCV, который точно соответствует используемому вами компилятору? Помните, что ** все ** двоичные файлы MSVC (Qt, ваш проект, библиотеки и т. Д.) Должны быть скомпилированы с использованием той же основной версии MSVC. –

+0

Спасибо за предложения. Я использовал библиотеки как есть, сам их не строил. Тем не менее, я связываюсь с версией vc12. Я редактирую оригинальный вопрос, чтобы отразить это. – Ilya

ответ

1

Итак, после поиска и нескольких попыток я узнал, что было не так. Я привязывался к x86-библиотеке вместо x64. Если я перешел на x64 libs, я получал несоответствие между директивами Static и Dynamic linker. Связывание OpenCV статически не работает, поскольку сами библиотеки OpenCV ссылаются на libcmt.lib, тогда как Qt (предварительно построенные) динамически связывают ссылки с контр-частью libcmt.lib, то есть с msvcrt.lib. И поскольку эти две библиотеки MS являются одними и теми же (только один для статической компоновки, другой для динамического), у меня было два варианта: либо перестроить Qt, либо OpenCV (чего я не хочу делать - я очень новичок в такие проблемы) или динамически связывать OpenCV. Я выбрал второй вариант. Все, что вам нужно сделать, это удалить все ссылки на папки и библиотеки/staticlib, что он содержит, и заменить его следующим:

win32:CONFIG(release, debug|release): LIBS += -LC:/opencv/build/x64/vc12/lib -lopencv_world300 
else:win32:CONFIG(debug, debug|release): LIBS += -LC:/opencv/build/x64/vc12/lib -lopencv_world300d 

Обратите внимание, что один должен распространять соответствующие библиотеки DLL с приложением (находится в сборки \ x64 \ vc12 \ bin \ folder).

 Смежные вопросы

  • Нет связанных вопросов^_^