其实官网已经有了各个版本在不同平台下的编译好之后的包,一般只需要下载下来即可使用。但是为什么要自己编译?
因为官网下载的安装包解压出来的库使用的编译器与自己的编译器版本不同,所以即使编译项目成功了,但运行时会导致一些莫名其妙的错误,这时候自己编译就显得很重要,话不多说,本人的环境:
VS2015 ,VS2017(实际也没有用),QT5.12,Cmake3.20.1,opencv4.1.1 在win10下
目标是编译成Mingw64 Qt下使用,也为了以后跨平台做准备,就不用编译成windows的版本了。
先下载安装工具
下载安装Cmake 选择mis文件:https://cmake.org/download/
https://cmake.org/download/
下载QT
http://download.qt.io/archive/qt/
下载opencv 选择 sources
https://opencv.org/releases/page/2/
在这里 Sources 是源码 ,Windows是专门为Windows编译的包,exe解压之后就可以在vs下引用库即可(可参考文章:https://blog.csdn.net/qq_27825451/article/details/103036687 ),当然用这个解压之后里面source内容也是可以的。推荐如果自己编译还是用soureces
接下来就是设置环境变量了
将安装好的cmake和qt文件夹下的bin目录添加到电脑系统环境变量里(很重要,在2.1和2.2安装好之后要把路径加到系统path变量中)
注意:QT路径对中文比较敏感,最好保证路径中不带有中文
单独下载适合自己的版本:https://sourceforge.net/projects/mingw-w64
后续操作和下面一样,以下面的章节详细介绍
QT在搭建编译环境的时候本生是可以带各种版本的编译器,这里不多说,找到qt安装的目录,在相应的地方都会有不同的版本
按照下面的步奏:
第一次编译会有相应的设置:
到这一步是为了选择QT中的或者自己下载的Mingw版本去编译。
config完成后,CMake的界面如图所示显示了大片的红色。
一般会报错,解决方法如下,这样的好处是将所有的lib文件打包成一个lib文件,在调用的时候只需要一次很简洁,在测试代码中可以体现。
同时我在上述的红色框里还选择了在这里我们选中“WITH_OPENGL”、“WITH_QT”,将“WITH_IPP”取消这几个操作,反正这个不选也可以,但是我是选了的。
configure结束之后,没有错误之后,一定要Generate!!!!!!,不然想继续下面操作会报错: mingw32-make: *** No targets specified and no makefile found. Stop.
上述操作结束之后就会在编译的opencv_build文件下看到生成一大推东西
继续下面操作:
输入mingw32-make -j 4(-j 后跟的是用几核编译 提升编译速度)等待完成 。
再输入mingw32-make install 完成后opencv库我们就编译成功了。
如果过程到百分之几就跳出,需要在网上找相应的问题解决。上述在opencv_build下install就是我们编译好的opencv,在后面测试程序中用到。
其实理论上和上述操作过程是一样的,只是在qt中将很多步奏都集成到qt中,省了很多麻烦(但是我遇到好多问题,在最后编译过程出了问题,也没有成功,又成功的小伙伴私信我,让我也学习一下),下面讲大致方法说一下:
先讲Cmake添加到编译环境中去
用QTcreator打开 文件夹下的 sources\CMakeLists.txt
在打开编译中的build,设置对应参数,其实和Cmake差不多。
设置好之后
Cmake之后就开始构建,构建成功之后的:
在构建小锤子工具,开始构建就会有很多问题:
1、 error: [modules\core\CMakeFiles\pch_Generate_opencv_core.dir\build.make:76: modules/core/precomp.hpp.gch/opencv_core_Debug.gch] Error 1
2、 Duplicated modules LOCATIONS has been found
我在网上搜到的方法也没有很好的解决,所以只能到这了,但是我同事就是用这方法成功了。
在qt中建一个工程,讲2.2中的install文件放到和pro文件同级目录(很简洁吧,这个就是上述那个world的作用)
INCLUDEPATH += $$PWD\opencv411\include
我在实际测试中,debug和release下都可以跑,虽然说上说编译的是release版本(想要debug版本的,可以在cmake的时候有一个参数可以配置就行,现在看来没有必要)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "opencv2/opencv.hpp"
using namespace cv;//命名空间
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
Mat image = imread("D:\\11.jpg",1); //这是我D盘根目录下名为11的图片的路径
namedWindow("my image",WINDOW_AUTOSIZE);//新建自适应大小的窗体
imshow("my image",image);//显示窗体
}
MainWindow::~MainWindow()
{
delete ui;
}
如果在编译过程中
问题:
1、E:\test\opencv411_test\mainwindow.cpp error: undefined reference to `cv::imread(std::__cxx11::basic_string
2、Qt opencv 程序异常结束,crashed
3、 error: cannot find E:\test\opencv411_test\opencv411\x64\mingw\bin: Permission denied
多半是pro文件没有设置好
最后成功显示
因为自己搭建过程中图片保存丢失,就从下面文章借用了相关的图片。
参考文章:1、https://www.jianshu.com/p/dce4d0a13fad
2、https://blog.csdn.net/happyjoey217/article/details/115691436
3、https://blog.csdn.net/flfihpv259/article/details/71515937
4、https://blog.csdn.net/gufeiyunshi/article/details/50967440
5、https://blog.csdn.net/ztq_12345/article/details/90902844