未解决的符号:Qt和OpenCV

3
我一直在尝试在我的基于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/

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


你自己构建了OpenCV吗?如果没有,那么你是否下载了与你使用的编译器完全匹配的OpenCV二进制文件?请记住,所有 MSVC二进制文件(Qt、你的项目、库等)必须使用相同主要版本的MSVC进行编译。 - Kuba hasn't forgotten Monica
谢谢建议。我使用的是现成的库,没有自己构建。但是,我正在链接到vc12版本。我也会编辑原始问题以反映这一点。 - Ilya
1个回答

3
所以在搜索和多次尝试后,我发现了问题所在。我链接的是x86库而不是x64库。如果我改为x64库,我会得到静态和动态链接器指令之间的不匹配。将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文件一起分发(位于build \ x64 \ vc12 \ bin \文件夹中)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接