工具:MATLAB R2014b,Qt 5.6.1,
目标:通过MATLAB写一个简单的函数,生成动态链接库DLL,再在Qt上调用
1.在MATLAB主页新建一个函数
记住函数的名字和保存的函数文件的名字要相同,比如我写了一个函数f,保存时文件名需要是f.m
2.生成动态链接库
首先要查看一下自己的MATLAB有没有编译器,在命令行输入!mcc
好像是没有破解完全的原因,后来卸载重新破解了2014b,还是同样的问题,后来使用了mex命令出现了以下的错误
好像是我压根就没有安装编译器,进入MATLAB给的网站,
http://www.mathworks.com/support/compilers/R2014b/win64.html
选择R2014b的Supported Compilers下面的Details
拖到下面下载64位https://www.microsoft.com/en-us/download/details.aspx?id=8279
安装完之后,又出现了以下问题
安装了很久很久的.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,用其他的激活码重新激活。
用其他激活码激活后,出现了一下问题。
点击确定后会继续安装,然后再次进入MATLAB会要你重新激活,将license文件重新导入之后,MATLAB激活成功。
但是,再次进入MATLAB的时候又出现了新的问题。
问题解决:在网上的crack文件中将“libmwservices.dll”文件替换“...\matlab\bin\win64”下的“libmwservices.dll”
然后可以顺利进入MATLAB,但是仍然没有编译器。在网上看到了无数人都出现了和我一样的情况,但是好像都没几个人真正解决。
最后发现是我打开MATLAB2014b的时候license number是unknown,说明我下的2014b并没有破解完全,白忙活了一天。
解决方法:换一个被完全破解的MATLAB,这里我选择了MATLAB R2014a,百度云资源真是非常难找了。
安装激活matlab2014a后,出现了新的问题。
后来发现原来是我有几个文件没有替换,换掉之后就好了。
旧的不去新的不来,又出现了新的问题。
这篇博客有介绍MATLAB 2014a VS2015找不到编译器的问题https://blog.csdn.net/hzd12368/article/details/70526955
都选择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的命令)时间可能较长,大约一分钟左右,生成了如下图的文件。
至此,动态链接库就已经生成了。
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
后来在某个大佬的博客上发现了解决办法:即在.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();
}
以上错误仍没有解决,如有大佬知道怎么做,麻烦不吝指教,感激不尽。
把所有代码都附上,希望有人能够解决我的问题,留言告诉我,3q
代码资源:https://download.csdn.net/download/folk_/10339914
主要参考的博客还有:https://blog.csdn.net/Althindor/article/details/77679303
历时3天,最后放弃使用Qt了,转向使用Matlab写界面。