MathGL2.4+VS2019+Qt5 开发环境配置
Posted 九磅十五便士_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MathGL2.4+VS2019+Qt5 开发环境配置相关的知识,希望对你有一定的参考价值。
--------By 九磅十五便士
1. 什么是MathGL
MathGL是一个能够应用在Linux和windows下高质量显示图形的开源库,通常应用与科学绘图或大型数组(矩阵)的可视化。
同时MathGL内部也包含有诸多拟合函数,类似Matlab中的一些fitting功能。使用过程中仅需要一些样本数据点以及输入这些点的经验公式即可。但是依据MathGL的官方文档描述的自身所携带的一些非线性拟合方法存在若干缺陷:由于算法的特点,拟合结果可能对系数的初始值有很强的依赖性。在一般情况下,当系数有几个局部“最优值”时,程序仅能返回第一个!难以保证全局最优。
MathGL拥有非常强大的功能,在官方文档中有详细的展示,最好的使用手册就是官方文档了:
Top (MathGL 2.4.4) (sourceforge.net)
Fig.1 MathGL一些酷炫的应用
2. 配置与开发
MathGL是一个可用于C/C++数据可视化的函数库,可以对不同种类的数据进行可视化。由于MathGL本身不具有显示功能,需要配合其他的工具进行显示,如OpenGL、OpenCV的highgui模块、Qt的Widget模块(ui界面上的一些控件均可)。MathGL依赖另外的第三方库libpng,而libpng又依赖于Zlib。因此我们需要同时编译MathGL、libpng、zlib。编译顺序为:
Zlib——>pnglib——>MathGL
软件版本:
- 注1:一定要注意版本,我尝试了vs2015+qt5.7,配置失败,主要原因是最后在cmake MathGL源码的时候出现错误CMP0071,查了很久的资料并没有找到合理的解决办法,而qt5.15在整个搭建过程中十分流畅
- 注2: vs2019注意一下c++标准,我在c++17标准下会报错。
- Visual Studio 2019
- Qt 5.15.2 ( 5.15以上支持vs2019,选择适配的vs与qt真的会事半功倍,少走很多弯路)
一些编译源码及工具:
- Cmake-3.18.0-win64 (编译工具)
- zlib-1.2.11 (zlib源码)
- libpng-1.6.37 (libpng源码)
- MathGL-2.4.4 (MathGL源码)
3.Zlib的编译
3.1 cmake
解压安装编译工具 Cmake,进入安装路径,打开bin文件夹下的cmake-gui.exe,指定源码路径和编译输出路径。
Fig.2 cmake编译文件以及输出目录设置
3.2 cmake操作
点击Configure,配置编译环境,选择visual studio的版本以及编译平台,最后点击finish完成配置,结束配置后,Cmake会出现提示“Configuring done”。
Fig.3 cmake编译配置
3.3 vs编译
确认出现“Configuring done”之后点击cmake-gui上的Generate按钮,生成工程文件,正确生成后会提示“Generating done”,点击Generate按钮右侧的Open Project,打开工程文件*.sln;
3.3.1 debug下的静态库编译
我们的目的是为了在debug和release模式下生成一个静态库文件,也就是*.lib文件,因此再打开工程后,先确认编译平台正确与否,确保为Debug与x64。
Fig.4 visual studio编译平台设置
3.4 zlibstatic的编译
在解决方案资源管理器中选中zlibstatic项目,右键选择“生成”,若vs中不提示失败,则说明zlibstatic的静态库已经编译完毕,打开路径所在位置的文件夹,可以看到我们的zlibstatic.lib已经编译完成。
Fig.5 zlibstatic的编译
若需要release版本的zlibstatic.lib,则将编译平台更改为release和x64,重复上述步骤即可。最后操作cmake-gui上的清除缓存按钮,完成zlib静态库的全部编译流程。
4. libpng的编译
4.1 camke编译libpng
打开cmake-gui,同样的选择libpng的源码目录和输出目录,点击“Configure”,生成配置文件。此时会出现重大报错信息,不必紧张,查看报错,报错信息提示并未找到zlib的静态链接库。
Fig.6 libpng生成配置文件的报错
勾选cmake-gui界面上的“Advanced”,并且在“search”栏输入zlib,分别对ZLIB_INCLUDE_DIR、ZLIB_LIBRARY_DEBUG、ZLIB_LIBRARY_RELEASE进行路径指定:
Fig.7 libpng的ZLIB依赖配置
再次点击“Configure”,重新进行配置,出现“Configuring done”后点击“Generate”生成工程文件,点击“open project”打开工程。
在vs下编译debug与release的libpng静态库文件。
在解决方案资源管理器中选中png_static项目,右键选择“生成”,此时会出现大量错误,这是由于无法找到"zconf.h"头文件。
Fig.8 libpng编译静态库报错
回到之前编译的zlib文件夹,查看该文件,发现缺失的文件其实并没有缺失,而是被更改了名字,从"zconf.h"变成了"zconf.h.include"。这是由于cmake过程中对文件名进行了修改,我们将文件名字改回去即可。(注:可能是其他不同文件,单操作相同,把.include后缀删除,仅保留.h即可)。
Fig.9 头文件后缀名的修改
修改完成后,再次选中png_static项目,右键选择“生成”,顺利完成编译。将debug与release的静态库编译完成后,就可以开始最终的编译了。
5. MathGL编译
同样的清除缓存按钮,然后选择MathGL源码目录。又出现了与编译libpng时相同的错误,只不过这时所缺少的文件就比较多了,ZLIB、libpng、以及Qt的相关文件,需要我们慢慢更改。
5.1 ZLIB_XXXXX_XXXX文件路径指定
勾选“Advance”,在“search”中输入zlib,指定ZLIB_XXXXX_XXXXX的路径
Fig.10 MathGL中zlib依赖的配置
再次“configure”,任然报错,这次添加PNG_XXXXX_XXXX的相关路径。
Fig.11 MathGL中libpng依赖的配置
在search栏中输入qt后勾选qt5,然后再次configure,仍然报错,这是缺少相关qt的路径(注1:勾选Qt5后configure,才会出现相关路径选项),值得注意的是,qt5的若干源文件在qt5.7安装目录下的/msvc2015_64/lib/cmake中,一定是以Qt5为前缀的文件夹。(注2:选项中的Qt5webKitWidgets_Dir可以忽略,因为没有该文件)。
Fig.12 MathGL中qt依赖的配置
添加完毕后,configure会出现两个警告,不影响最终编译,可以忽略,点击“generate” “open project”。
5.2 编译mgl-static和mgl-qt5-static项目
打开vs后需要分别编译mgl-static和mgl-qt5-static两个项目,首先现在debug下编译mgl-static。
选中mgl-static后右键“生成”,等待一段时间,会出现一个重要错误
Fig.13 vs编译mgl-static报错
双击错误提示,跳转进文件后发现,该头文件丢失,但是上方的注释温馨提示了我们解决办法:
Fig.14 pnglibconf.h文件丢失
在scripts文件夹中找到pnglibconf.h.prebuild文件,复制一份到目录下的src文件夹(mathGL\\mathgl-2.4.4\\mathgl-2.4.4\\src,也就是其他.cpp所在目录),然后更改为.h
Fig.15 解决 pnglibconf.h丢失问题
更改后在vs中重新选中mgl-static,右键点击“生成”。顺利过编译,但是静态库的位置却跟以上操作有所不同,需要留意一下,然后按照输出所制定的路径找到我们所编译完成的静态库mgl-static.lib,为了与release编译所得区分开,将其改名为mgl-staticd.lib,表示debug版本的lib。
Fig.16 编译debug版本的mgl-staticd.lib
重复上操作完成mgl-qt5-static项目的静态库编译。最终的到4个.lib文件,复制整理出来,作为后续调用文件。同时将bulid文件夹下的include/mgl2中的三个*.h文件拷贝至源文件下的include/mgl2中。
Fig.17 最终获得的若干文件
至此,所有的MathGL源文件编译完毕。
6.环境配置与简单应用:
完成了所有的源码编译,也就是准备好了工具,剩下的就是应用和开发环境的配置。
6.1 QMathGL使用
建立一个qt gui application(或qt widget application)新项目,命名为mathDemo
Fig.18 新建demo程序
打开属性管理器,建立一个新的项目属性表,起名为mathGL.props,并记好所在路径(方便以后其他项目直接使用,避免重复配置).
Fig.19 新建属性表
双击新建的项目属性表,进行配置(release同样操作):
- 包含目录中添加D:\\mathGL\\mathgl-2.4.4\\mathgl-2.4.4\\include
- 库目录中添加D:\\mathGL\\mathgl-2.4.4\\mathgl-2.4.4\\MathGLLIB (该文件夹中整理了上述4个.lib)
- 在链接器的输入选项中添加mgl-qt5-staticd.lib、mgl-staticd.lib、zlibstaticd.lib、libpng16_staticd.lib(release添加mgl-qt5-static.lib、mgl-static.lib、zlibstatic.lib、libpng16_static.lib)
Fig.20 属性表配置
6.2 mian函数
配置完成后,问了方便测试,直接打开main.cpp,写一段测试程序:
#include "mathDemo.h"
#include <QtWidgets/QApplication>
#include<mgl2/mgl.h>
#include<mgl2/qmathgl.h>
int testData(mglGraph *gl) {
//定义一个数组, 也可以使用vector<float>
//类mglData的构造函数中支持数组和std::vector
float dataX[] = { 1,2,3,4,5,6,7,8 };
float dataY[] = { 2,3,5,6,1,2,5,9 };
float dataZ[] = { 3,4,1,2,5,6,7,7 };
mglData X(8, dataX);//x坐标个数,x坐标值
mglData Y(8, dataY);//x坐标个数,x坐标值
mglData Z(8, dataZ);//x坐标个数,x坐标值
gl->SetRanges(X, Y, Z);//为坐标轴设置大小
//若有错误,不必在意这个错误,如果不影响编译,可能是一个重载函数出问题了
gl->Rotate(50,50); //改变一个观察角度
gl->Axis();
gl->Grid();
gl->Plot(X, Y, Z, "ro"); //若有错误,不必在意这个错误,如果不影响编译,可能是一个重载函数出问题了
return 0;
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
mathDemo w;
w.resize(800, 600);//改变个大小
/**************MathGL核心函数***************/
QMathGL *qmgl = new QMathGL(&w);//由于MathGL自身没有显示,所以要制定一个显示窗口
//这里选择自动生成出来的mindwindow,也可以选择界面
//中的其他控件ui.xxxxx
qmgl->setDraw(testData); //绘制数据点
qmgl->setRotate(true); //设置可旋转
qmgl->setZoom(true); //设置可缩放
qmgl->update();
w.show();
return a.exec();
}
6.3 错误处理
编译发现有很多_CRT_STDIO_ISO_WIDE_SPECIFIERS不匹配错误,这时候需要添加预处理器信息,打开刚刚的项目属性表,在c/c++ -->预处理器中添加_CRT_STDIO_ISO_WIDE_SPECIFIERS
Fig.21 _CRT_STDIO_ISO_WIDE_SPECIFIERS 预处理宏添加
重新编译,mglData的出现链接错误,这个MathGL库自身的函数:在预处理器中添加 MGL_STATIC_DEFINE, 即可解决
Fig.22 MGL_STATIC_DEFINE预处理宏添加
再次编译 又出现了Qt的链接错误,这是由于MathGL的显示依赖于Qt的qtprintSupport模块,我们为期添加上即可:
在包含目录上添加D:\\Qt\\5.15.2\\msvc2019_64\\include\\QtPrintSupport,在库目录添加上D:\\Qt\\5.15.2\\msvc2019_64\\lib,并在连接器上添加附加依赖项Qt5PrintSupportd.lib
Fig.23 QtPrintSupport模块添加
顺利通过编译,执行之后:
Fig.24 demo
7. 总结:
整体的编译过程不复杂,主要要注意的是开发工具版本的选择,vs2019+qt5.15.2 在c++14和c++11标准下可以完美编译成功,c++17标准下失败。
最终Debug下链接器的输入为:
libpng16_staticd.lib
mgl-qt5-staticd.lib
mgl-staticd.lib
zlibstaticd.lib
Qt5PrintSupportd.lib
最终Release下链接器的输入为:
libpng16_static.lib
mgl-qt5-static.lib
mgl-static.lib
zlibstatic.lib
Qt5PrintSupport.lib
以上是关于MathGL2.4+VS2019+Qt5 开发环境配置的主要内容,如果未能解决你的问题,请参考以下文章
OsgEarth开发笔记:Qt5.15.2在QtCreator集成Osg3.6.3+OsgEarth3.1+OsgQt的vs2019x64版本开发环境搭建
OsgEarth开发笔记:Qt5.15.2在QtCreator集成Osg3.6.3+OsgEarth3.1+OsgQt的vs2019x64版本开发环境搭建