Qt使用MinGW-64bit编译器和配置64位OpenCV3时遇到的一些问题:In function cv::String 和 undefined reference to ‘XXX’ 等
前言
最近在Qt上配置OpenCV3的环境,过程不怎么顺利,走了弯路也长了见识,因此决定将过程记录下来,做个总结。
一、安装64位编译器
1. OpenCV3 64位软件需要 64位的编译器
之前参照《OpenCV3编程入门》,使用VS2019软件平台,OpenCV版本是opencv-3.4.14。这个版本的OpenCV不再提供32位软件了,所以build文件夹里面只有x64版本的软件,所以得使用64位的编译器(如下图)。(sources文件中有原码,据说可以自行编译成32位版本的软件使用,也算一条出路)
2. 给Qt添加64位编译器
后来使用Qt,就打算在Qt上使用OpenCV。
依照网上的教程,将之前VS2019使用的OpenCV的 工程包含目录(include) 和 工程库目录(lib)添加到 .pro 文件中。因为我使用的Qt版本是qt-opensource-windows-x86-5.9.9,安装时只装了 WinGW 32-bit 这一个编译器(如下图),而且这个软件本身也是32位的。
我首先打算装一个64位的Qt的
Qt下载(多种下载通道+所有版本)
在镜像库中发现Windows的没有64位版的。但是网上说Qt软件是32位版的也没关系,安装了64位的编译器就能编译64位的程序,同样能用64位的库。
Qt的各个模块 图解Qt安装(Windows平台) 里面有讲解。
于是动手补充安装Qt的 MSVC 2017 64-bit 编译器模块。在Qt的安装文件夹中有一个 MaintenanceTool.exe 程序,据说可以像VS2019那样Add&Remove模块,我按照网上的教程进行了操作
QT安装、添加或删除、更新组件
并没有弹出安装MSVC 模块的界面,于是重装软件。在网上找安装MSVC的教程,包括按照 QT5.14搭建MSVC(VS2017) x86 以及64位编译器开发环境搭建(GDB配置) 的第三步安装了 Win10的SDK 等。
结果,新建工程,选编译器的时候选 MSVC 2017 64-bit,发现左边栏里只有.pro文件,其它文件和文件夹没有加载。
按 工具——>选项——>Kits
这里是黄色的三角号警告,一顿操作没修好,QT Kits的MSVC2017总是不能用(Win10 SDK ,无论只装Debuger Tool还是全装上都是这个样子),遂放弃,转而安装MinGW-W64。
按照网上的教程
MinGW-w64安装教程——著名C/C++编译器GCC的Windows版本
找到了网站,下载了 mingw-w64-install.exe ,但在线安装失败,遂放弃。
偶尔在网上看到,
QT5.14搭建MSVC(VS2017) x86 以及64位编译器开发环境搭建(GDB配置)
高版本的Qt自带 MinGW 64bit 编译器,遂下载了 qt-opensource-windows-x86-5.14.2.exe 进行安装。
至此,64位编译器的问题算解决了,接下来是OpenCV3的配置问题。
二、OpenCV3的软件版本选择、下载和配置代码
想要在Qt里面使用OpenCV,就得把OpenCV的 工程包含目录(include) 和 工程库目录(lib)添加到 .pro 文件中。
如果报错说 “No such file or directory”,那有可能是 INCLUDEPATH 部分出问题了。参考QT包含opencv时-- No such file or directory解决办法。
如果报错如下,那就是 LIBS部分 和 工程库目录 出问题了,这个问题就比较复杂了。
In function 'cv::String::String(char const*)'
undefined reference to `cv::String::allocate(unsigned long long)''cv::String::allocate(unsigned long long)'
In function 'cv::String::~String()'
undefined reference to `cv::String::deallocate()'
In function `cv::Mat::~Mat()':
undefined reference to `cv::Mat::deallocate()'
我最早使用 opencv-3.4.14-vc14_vc15.exe 软件安装的OpenCV,在VS2019里面正常使用。在Qt工程的.pro文件里面的引用如下:
INCLUDEPATH += C:\AllofC\setofCV3\opencv\build\include\opencv\
C:\AllofC\setofCV3\opencv\build\include\opencv2\
C:\AllofC\setofCV3\opencv\build\include
LIBS += C:\AllofC\setofCV3\opencv\build\x64\vc15\bin\opencv_world3414d.dll
但是这样会报错,工程库目录不对。参考下文:
Qt5.8 mingw 配置opencv3.2
为什么我们需要编译这个mingw版本的opencv库?
答:我们在opencv官方一开始的时候下载的opencv文件,解压后里面有两个文件夹,一个是build,一个是source,问题就来了,build这个文件夹实际上是官方已经提前给我们编译好了的库,但是,这必须得有一个前提,就是你必须使用的是msvc编译器,而我们使用的是mingw编译器,所以,你想想,不同的编译器,肯定库文件不一样,就不能使用,对吧?所以,就有了下文为mingw编译器编译opencv的库。
————————————————
版权声明:本文为优快云博主「动物都会叫<_>」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_21078557/article/details/78957165
Windows下Qt安装和配置OpenCV(vs2021+Qt5.14.2+opencv4.5.5)
一、开始记录之前先看下Windows下MSVC和minGW编译器的区别:
MSVC:即Microsoft Visual C++ Compiler,即微软自己的编译器我们下载Windows下的OpenCV时,会带两个文件夹VC14,VC15(分别与Visual Studio的版本有对应关系),这两个文件夹下的库可以直接运行不需要编译将VS作为Qt的开发环境也是使用这个编译器的缘故
MinGW:我们都知道GNU在Linux下面鼎鼎大名的gcc/g++,MinGW则是指Minimalist GNU for Windows的缩写它是将GNU开发工具移植到Win32平台下的产物,即一套Windows上的GNU工具集用其开发的程序不需要额外的第三方DLL支持就可以在Windows下运行,相对地,不使用动态库导致的就是编译出来的程序大很多。也是可以设置使用静态库的
简单概括就是用MSVC编译器不需要自己编译OpenCV库,用MinGW需要用Cmake编译OpenCV库(及其繁琐)
这两个编译器的区别:
MSVC(Microsoft Visual C++ Compiler)是指微软的VC编译器
MinGW是指是Minimalist GNU on Windows的缩写。它是一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合,允许你在GNU/Linux和Windows平台生成本地的Windows程序而不需要第三方C运行时(C Runtime)库。
————————————————
版权声明:本文为优快云博主「knaha」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/knaha/article/details/103490698
所以,OpenCV官方给的build文件MinGW不能用,得找使用MinGW编译器编译成的文件。参考下文可知,有两条出路。
QT5在windows下调用OpenCV库出现: undefined reference to `xxxxx’ 错误解决办法(适用MinGW编译器)。
网上用MinGW编译器自己编译OpenCV的教程有不少,都表示这个过程繁琐且会遇到很多报错,而且不同版本编译器和OpenCV报错和解决方法还不同,遂去下载别人编译好的文件。
huihut/OpenCV-MinGW-BuildPublic(这个网页容易打开失败,多试两次)
这里有多个版本。点击Configuration查看详细信息,尤其是编译器版本。我第一次下载了这个OpenCV 3.4.9,解压后里面也有个x64文件夹,误导我以为它是64位的,其实它是MinGW-x86-7.3.0编译器编译的,是32位的。
点击Configuration查看详细信息
下图这个OpenCV 3.8.4 x64才是我需要的。
解压后,还需要添加环境变量,然后就可以到Qt工程的.pro文件中去添加目录了。参考代码如下:
INCLUDEPATH += C:\AllofC\setofCV3\OpenCV-MinGW-Build-OpenCV-3.4.8-x64\include\opencv2\
C:\AllofC\setofCV3\OpenCV-MinGW-Build-OpenCV-3.4.8-x64\include\opencv\
C:\AllofC\setofCV3\OpenCV-MinGW-Build-OpenCV-3.4.8-x64\include
LIBS += C:\AllofC\setofCV3\OpenCV-MinGW-Build-OpenCV-3.4.8-x64\x64\mingw\lib\libopencv_*.a
我总结了一下:
- 安装完OpenCV之后记得添加环境变量,不然不行。
- Qt里面的目录不能有汉字和空格,我最早按照《OpenCV3编程入门》里面作法把OpenCV安装在某个 “Program Files” 文件夹下面,于是重装了OpenCV。(后来在网上看到,路径有空格的话用引号引起来也行,但我没试过)
- 这两行代码的格式在网上有多种写法,搞得我不知道是我的写法错了还是引用目录不行。不过我现在可以确定这种写法没错。总结就是:INCLUDEPATH中,前面的每个目录都要以" \ “结尾,最后一个目录不用。有人用” / "结尾,好像也行。
- libopencv_*.a 的意思是所有以 “libopencv_” 开头,并以 “.a” 结尾的文件,所以 lib 文件夹下面的相关文件都被包含进去了。可以看出,MSVC版的lib文件夹下面只有两个 .lib 文件,而MinGW版的lib文件夹下面有一堆 .dll.a 文件。
最后,用imread读取图片的时候,需要填写图片的地址。从图片的属性那里复制地址会使用 " \ " 符号:
imread("C:\AllofC\allofQt5142\Qt5142Saves\QtOpenCV3\try\pro01\1.jpg");
会报错:
OpenCV: terminate handler is called! The last OpenCV error is:
OpenCV(3.4.8) Error: Assertion failed (size.width>0 && size.height>0) in imshow, file C:\Library\opencv-3.4.8\source\modules\highgui\src\window.cpp, line 382
需要使用 " / " 符号才行:
imread("C:/AllofC/allofQt5142/Qt5142Saves/QtOpenCV3/try/pro01/1.jpg");
总算能正常编译和运行了。