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版本开发环境搭建

VS2013 平台下搭建 QT5.3 开发环境

QT5.6.2基于VS2013开发环境配置(Win7 64位)

VS2010配置QT5.5.0开发环境

vs2013+qt5.3.2+pcl1.8.0+osg2.3开发环境配置