未解析符号:Qt和OpenCV
Unresolved symbols: Qt and OpenCV
我一直在尝试在基于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文件夹中)。
- 如果不在窗口 10 中声明名为 openCV 的 openCV namedWindow,QT 图像显示将无法正常工作
- OpenCV QT,显示视频的帧(不使用while循环)
- 在从Qt调用的Python脚本中导入OpenCV崩溃
- 如何使用opencv和Qt拍摄部分桌面的照片
- 为arm64-v8a编译Qt和OpenCV
- 如何以及在何处使用带QT的Basler Cam实现opencv人脸检测代码
- 通过QT WebSocket将OpenCV Mat Image发送到HTML客户端
- 如何使用Opencv,qt creator,ming gw窗口在一起
- 带有QT OpenCV的多线程
- QT opencv msvc2015 x64
- multithreaded Qt+OpenCV
- QT OpenCV setMouseCallback "argument type does not match"
- 在Qt+Opencv中导入Gstreamer视频
- qt opencv -sigsegv显示转换的帧
- Ubuntu 上的 Qt+OpenCV 无法运行/调试:无法启动应用程序
- Qt + OpenCV 灰度误差
- Qt + OpenCV in Debian
- Qt OpenCV网络摄像头流打开和关闭
- 使用 Qt + Opencv 时未定义的 Opencv 引用
- Qt + OpenCV + Mac OS -> Can't fid libpng