1

我的 PC 上安装了 QT,它使用 Visual Studio 2010 编译器

在此处输入图像描述

我用一个简单的 hello world 应用程序对此进行了测试,它运行良好。

但是现在我正在尝试将 OpenCV 与 QT 一起使用。我已经安装了 Visual Studio 2010 express 和 professional,并且 opencv 在那里工作正常。但是,当我尝试在 QT 中运行 OpenCV 时,出现以下错误

main.obj:-1: error: LNK2019: unresolved external symbol "public: void __thiscall cv::Mat::deallocate(void)" (?deallocate@Mat@cv@@QAEXXZ) referenced in function "public: void __thiscall cv::Mat::release(void)" (?release@Mat@cv@@QAEXXZ)

main.obj:-1: error: LNK2019: unresolved external symbol "void __cdecl cv::fastFree(void *)" (?fastFree@cv@@YAXPAX@Z) referenced in function "public: __thiscall cv::Mat::~Mat(void)" (??1Mat@cv@@QAE@XZ)

main.obj:-1: error: LNK2019: unresolved external symbol "int __cdecl cv::waitKey(int)" (?waitKey@cv@@YAHH@Z) referenced in function _main

    main.obj:-1: error: LNK2019: unresolved external symbol "void __cdecl cv::imshow(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class cv::_InputArray const &)" (?imshow@cv@@YAXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ABV_InputArray@1@@Z) referenced in function _main
    
    main.obj:-1: error: LNK2019: unresolved external symbol "public: __thiscall cv::_InputArray::_InputArray(class cv::Mat const &)" (??0_InputArray@cv@@QAE@ABVMat@1@@Z) referenced in function _main
    
    main.obj:-1: error: LNK2019: unresolved external symbol "void __cdecl cv::namedWindow(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,int)" (?namedWindow@cv@@YAXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z) referenced in function _main
    
    main.obj:-1: error: LNK2019: unresolved external symbol "class cv::Mat __cdecl cv::imread(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,int)" (?imread@cv@@YA?AVMat@1@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z) referenced in function _main
    
    release\FirstProject.exe:-1: error: LNK1120: 7 unresolved externals

以下是我的FirstProject.pro文件的内容

#-------------------------------------------------
#
# Project created by QtCreator 2013-04-26T11:15:33
#
#-------------------------------------------------

QT       += core

QT       -= gui

TARGET = FirstProject
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app


SOURCES += main.cpp

INCLUDEPATH += C:\opencv\build\include\
LIBS += -LC:\opencv\build\x86\vc10\lib \
-lopencv_calib3d240d.lib\
-lopencv_contrib240d.lib\
-lopencv_core240d.lib\
-lopencv_features2d240d.lib\
-lopencv_flann240d.lib\
-lopencv_gpu240d.lib\
-lopencv_haartraining_engined.lib\
-lopencv_highgui240d.lib\
-lopencv_imgproc240d.lib\
-lopencv_legacy240d.lib\
-lopencv_ml240d.lib\
-lopencv_nonfree240d.lib\
-lopencv_objdetect240d.lib\
-lopencv_photo240d.lib\
-lopencv_stitching240d.lib\
-lopencv_ts240d.lib\
-lopencv_video240d.lib\
-lopencv_videostab240d.lib

我尝试链接到以下 FirstProject.pro 内容,但一点也不好

#-------------------------------------------------
#
# Project created by QtCreator 2013-04-26T11:15:33
#
#-------------------------------------------------

QT       += core

QT       -= gui

TARGET = FirstProject
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app


SOURCES += main.cpp

INCLUDEPATH += C:\opencv\build\include\
LIBS += -LC:\opencv\build\x86\vc10\lib \
-lopencv_core240 \
-lopencv_highgui240 \
-lopencv_imgproc240 \
-lopencv_features2d240 \
-lopencv_calib3d240

以下是我的代码

主文件

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;

int main()
{

    Mat image = imread("D:/Tulips.jpg");

    if(!image.data)
    {
        cout << "Error loading image" << endl;
    }
    else
    {
        namedWindow("Image");
        imshow("Image",image);
    }

    waitKey(0);
    return 0;

}

为什么我会收到此错误?

4

3 回答 3

2

QT 项目文件尝试统一处理文件/目录分隔符,即正向 v 的反斜杠。使用哪个无关紧要。但是,也许有一些翻译正在进行。

尝试用正向版本“/”替换所有反斜杠“\”。Qmake 会适当地转换它们。

用。。。来代替-LC:/opencv/build/x86/vc10/lib

这也可能是问题所在 INCLUDEPATH 上的最后一个反斜杠。也许它正在加入下一行?

于 2013-04-26T06:37:12.853 回答
2

我找到了答案。解决此问题的唯一方法是使用完整路径逐个添加库

LIBS += C:/opencv/build/x86/vc9/lib/opencv_calib3d240.lib
LIBS += C:/opencv/build/x86/vc9/lib/opencv_contrib240.lib
于 2013-04-30T17:29:31.347 回答
1

我有同样的问题,但我无处找到答案。经过 8 天的尝试修复它,我终于找到了答案,我想与你分享。

当你使用静态链接opencv首先检查你的库是否真的是静态链接的,这样做打开一个开发者命令提示符msvc,导航到你的库路径,然后输入下面的命令:

lib /LIBS opencv_world.lib

而不是 opencv_world.lib 您可以放置​​任何其他库名称。

然后检查其中只有引用的 .obj 文件,这意味着你可以使用这个库静态的。然后记住当你在 opencv 中使用静态库时,你需要在其他一些库中进行你的项目,而在动态链接中你不需要。这些库位于您的库目录中,它们的名称不以 opencv 开头。你可以在下面看到其中一些:

IlmImf.lib
ippicvmt.lib
ippiw.lib
ittnotify.lib
libjasper.lib
libtiff.lib
libwebp.lib
zlib.lib

请记住,如果您收到错误“找不到库”,请使用确切的路径添加它。例如 :

LIBS += E:\opencv\build-x86-static\install\x86\vc15\staticlib\zlib.lib
于 2020-06-28T16:14:52.100 回答