c++ - 未解析的符号 : Qt and OpenCV

标签 c++ qt opencv linker-errors qmake

我一直在尝试在基于 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;),代码将编译并运行。有了这条线,我得到了两个 Unresolved 符号错误:

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 中的另一个库,但此时我非常乐意尝试任何建议。

最佳答案

所以在四处搜索和多次尝试后,我发现了问题所在。我链接到 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\文件夹中)。

关于c++ - 未解析的符号 : Qt and OpenCV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32450729/

相关文章:

c++ - 如何在 C++11 中使用 lambda 自动参数

c++ - 警告 C4251 : needs to have dll-interface to be used by clients of class

c++ - C++ 中的指针和引用作为参数

c++ - 每个条目有 2 列的 QTreeView

opencv - 如何使用OpenCV在白色背景上打印彩色文本

c++ - 使用 guest 对象更改类中构​​造函数的调用顺序

QtQuick 模板弹出窗口与 QtQuick Controls 弹出窗口

qt - 如何让 QtIFW 安装程序调用安装程序附带的实用程序?

python - Python 3 IP网络摄像头字节错误

python - 如何使用OpenCV或numpy打印直线上每个点的坐标?