未解析符号:Qt和OpenCV

Unresolved symbols: Qt and OpenCV

本文关键字:Qt OpenCV 符号      更新时间:2023-10-16

我一直在尝试在基于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 *)" (?fastFree@cv@@YAXPEAX@Z) referenced in function "public: __cdecl cv::Mat::~Mat(void)" (??1Mat@cv@@QEAA@XZ)
mainwindow.obj:-1: error: LNK2019: unresolved external symbol "public: void __cdecl cv::Mat::deallocate(void)" (?deallocate@Mat@cv@@QEAAXXZ) referenced in function "public: void __cdecl cv::Mat::release(void)" (?release@Mat@cv@@QEAAXXZ)

我尝试了各种方法来静态链接openCV库,但我一直得到相同的错误(我总是清理,重新运行QMake,然后为每次尝试重新构建项目)。下面是我的。pro文件现在的样子(我最后添加了所有的静态库,希望能有所帮助-它没有):

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/

关于配置,我是否遗漏了什么特别的东西?我很确定基本语法(如斜杠等)是ok的,因为我能够在另一个项目中链接Qt Creator中的另一个库,但我很乐意在这一点上尝试任何建议。

所以在搜索周围和多次尝试后,我发现了什么是错误的。我链接到x86库而不是x64。如果我改为x64库,我就会得到静态和动态链接器指令之间的不匹配。静态链接OpenCV将无法工作,因为OpenCV库本身链接到libmt。而Qt(预构建)则动态链接到libmt的对应部分。Lib,即到mscrit . 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(位于buildx64vc12bin文件夹中)。