学习笔记:Qt与Matlab混合编程及遇到的诸多问题(附DEMO)

工具:MATLAB R2014b,Qt 5.6.1,

目标:通过MATLAB写一个简单的函数,生成动态链接库DLL,再在Qt上调用

1.在MATLAB主页新建一个函数

记住函数的名字和保存的函数文件的名字要相同,比如我写了一个函数f,保存时文件名需要是f.m

学习笔记:Qt与Matlab混合编程及遇到的诸多问题(附DEMO)_第1张图片

2.生成动态链接库

 

首先要查看一下自己的MATLAB有没有编译器,在命令行输入!mcc

学习笔记:Qt与Matlab混合编程及遇到的诸多问题(附DEMO)_第2张图片

好像是没有破解完全的原因,后来卸载重新破解了2014b,还是同样的问题,后来使用了mex命令出现了以下的错误

学习笔记:Qt与Matlab混合编程及遇到的诸多问题(附DEMO)_第3张图片

好像是我压根就没有安装编译器,进入MATLAB给的网站,

http://www.mathworks.com/support/compilers/R2014b/win64.html

选择R2014b的Supported Compilers下面的Details

学习笔记:Qt与Matlab混合编程及遇到的诸多问题(附DEMO)_第4张图片

拖到下面下载64位https://www.microsoft.com/en-us/download/details.aspx?id=8279

安装完之后,又出现了以下问题

学习笔记:Qt与Matlab混合编程及遇到的诸多问题(附DEMO)_第5张图片

安装了很久很久的.NET Framework 4.7.1 进度条没有丝毫要前进的迹象,上网查了一下,安装.NET Framework 4.7.1 似乎还要顺带安装Win 10 Creator Update 以及VS 2017,其中要勾选. NET  Framework 4.7 development tools...

后来擅自决定去下载. NET Framework 4.5(为什么事情变得越来越复杂了...)

安装的时候却提示已经下载好高版本的Framework,后来点击原来的SDK,却可以正常安装了,但是进度条也是,纹丝不动。

后来结束了上面的进程。后来下载了SDK镜像,还是安装不了。

后来去控制面板处发现以前装VS2015的时候已经下载过高版本的SDK了。并不需要再安装SDK = = 

可能是网上都用20个1这个激活码,都没有下载编译器。所以决定卸载MATLAB,用其他的激活码重新激活。

用其他激活码激活后,出现了一下问题。

学习笔记:Qt与Matlab混合编程及遇到的诸多问题(附DEMO)_第6张图片

点击确定后会继续安装,然后再次进入MATLAB会要你重新激活,将license文件重新导入之后,MATLAB激活成功。

但是,再次进入MATLAB的时候又出现了新的问题。

学习笔记:Qt与Matlab混合编程及遇到的诸多问题(附DEMO)_第7张图片

问题解决:在网上的crack文件中将“libmwservices.dll”文件替换“...\matlab\bin\win64”下的“libmwservices.dll”

然后可以顺利进入MATLAB,但是仍然没有编译器。在网上看到了无数人都出现了和我一样的情况,但是好像都没几个人真正解决。

最后发现是我打开MATLAB2014b的时候license number是unknown,说明我下的2014b并没有破解完全,白忙活了一天。

解决方法:换一个被完全破解的MATLAB,这里我选择了MATLAB R2014a,百度云资源真是非常难找了。

安装激活matlab2014a后,出现了新的问题。

学习笔记:Qt与Matlab混合编程及遇到的诸多问题(附DEMO)_第8张图片

后来发现原来是我有几个文件没有替换,换掉之后就好了。

学习笔记:Qt与Matlab混合编程及遇到的诸多问题(附DEMO)_第9张图片

旧的不去新的不来,又出现了新的问题。

这篇博客有介绍MATLAB 2014a VS2015找不到编译器的问题https://blog.csdn.net/hzd12368/article/details/70526955

学习笔记:Qt与Matlab混合编程及遇到的诸多问题(附DEMO)_第10张图片

学习笔记:Qt与Matlab混合编程及遇到的诸多问题(附DEMO)_第11张图片

都选择C++那个选项

在存放函数的目录下,在命令行输入mcc -W cpplib:libf -T link:lib f.m -C,(这是生成f.cpp的命令)

 

 mcc -W lib:libf -T link:lib f.m -C(这个应该是生成f.c的命令)时间可能较长,大约一分钟左右,生成了如下图的文件。

学习笔记:Qt与Matlab混合编程及遇到的诸多问题(附DEMO)_第12张图片

至此,动态链接库就已经生成了。

3.QT调用MATLAB函数

将.h和.lib文件拷到QT的工程目录下。将QT工程运行一下会生成debug文件,将.dll和.ctf文件复制到debug文件下。

将MATLAB lib路径、头文件等写入Qt .pro文件:

注:若路径中有空格写pro文件的格式会略有变动

此处参考博客https://blog.csdn.net/qq_33221028/article/details/78398408

学习笔记:Qt与Matlab混合编程及遇到的诸多问题(附DEMO)_第13张图片

后来在某个大佬的博客上发现了解决办法:即在.pro文件中添加

DEFINES += __MW_STDINT_H__

总体的pro

#-------------------------------------------------
#
# Project created by QtCreator 2018-04-10T09:59:54
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = CTest2
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h\
         f.h

FORMS    += mainwindow.ui

OTHER_FILES += f.ctf

INCLUDEPATH += $$quote(C:/Program Files/MATLAB/R2014a/extern/include)
               $$quote(C:/Program Files/MATLAB/R2014a/extern/include/win64)

LIBS+=-L$$quote(C:/Program Files/MATLAB/R2014a/extern/lib/win64/microsoft) -llibmx
LIBS+=-L$$quote(C:/Program Files/MATLAB/R2014a/extern/lib/win64/microsoft) -lmclmcr
LIBS+=-L$$quote(C:/Program Files/MATLAB/R2014a/extern/lib/win64/microsoft) -lmclmcrrt
LIBS+=-L$$quote(C:/Program Files/MATLAB/R2014a/extern/lib/win64/microsoft) -llibmat
LIBS+=-L$$quote(C:/Program Files/MATLAB/R2014a/extern/lib/win64/microsoft) -llibmex
LIBS+=-L$$quote(C:/Program Files/MATLAB/R2014a/extern/lib/win64/microsoft) -llibeng
LIBS+=-L$$quote(C:/Program Files/MATLAB/R2014a/extern/lib/win64/microsoft) -llibmx

LIBS += C:\Users\lenovo123\Documents\MATLAB\test2\c++\f.lib

DEFINES += __MW_STDINT_H__

unix:!macx|win32: LIBS += -L$$PWD/./ -lf

INCLUDEPATH += $$PWD/.
DEPENDPATH += $$PWD/.


pro最后三行是我导入了外部库所生成的代码,就是将f.lib导入到工程

用c和cpp文件都尝试过,最后都无法避免的出现了undefined reference to ‘fInitialize’等error

void MainWindow::on_pushButton_clicked()
{
    if(!fInitialize())
        QMessageBox::warning(this,tr("error"),tr("fail to initialize lib"),QMessageBox::Ok);
    QString result;
    double para1,para2;
    para1 = ui->inputEdit1->text().toDouble();//获取输入框的第一个数
    para2 = ui->inputEdit2->text().toDouble();//获取输入框的第二个数
    mwArray a(1,1, mxDOUBLE_CLASS);
    mwArray b(1,1, mxDOUBLE_CLASS);
    mwArray c(1,1, mxDOUBLE_CLASS);
    a(1,1) = para1;
    b(1,1) = para2;
    f(1,c,a,b);
    /*
    double _x[2],_y[2];
    _x[0] = para1;
    _x[1] = para2;
    mxArray *input = mxCreateDoubleMatrix(1,2,mxREAL);
    mxArray *output = mxCreateDoubleMatrix(1,1,mxREAL);
    memcpy(mxGetPr(input),(void *)_x,sizeof(_x));
    mlxF(1,&output,1,&input);
    memcpy(_y,(double *)mxGetPr(output),sizeof(_y));
    */
    /**
     * 注:1.qt的lineEdit编辑框上接收的是QString类型,所以输入输出都要转换成需要的数据类型
     *     2.C++向MATLAB传参数的时候是以矩阵的形式传递,单个数值算1*1的矩阵
     *     3.fInitialize(),f(),mlxF(),fTerminate()这些函数都是f.c/f.cpp中写好的函数,f.h中都有定义
     */
    /**ui->resultEdit->setText(result);//在编辑框中输出结果**/
    fTerminate();
}
 

学习笔记:Qt与Matlab混合编程及遇到的诸多问题(附DEMO)_第14张图片

以上错误仍没有解决,如有大佬知道怎么做,麻烦不吝指教,感激不尽。

把所有代码都附上,希望有人能够解决我的问题,留言告诉我,3q

代码资源:https://download.csdn.net/download/folk_/10339914

主要参考的博客还有:https://blog.csdn.net/Althindor/article/details/77679303

历时3天,最后放弃使用Qt了,转向使用Matlab写界面。

你可能感兴趣的:(学习笔记:Qt与Matlab混合编程及遇到的诸多问题(附DEMO))