环境:VS2017、MATLAB2018b 64bit、 win10 64bit
语言:C++
说明:本文中以调用MATLAB绘图为例,且本工程只能在MFC Release x64下运行,若想在x86下运行,需下载32位MATLAB,重新编译配置工程等等。
两大步骤:
一、在MATLAB中编写自定义函数,并编译成VS能调用的文件(.lib .dll .h等)
1. 编写自定义函数,注意函数名和文件名要一相同,rec是返回参数,固定为10,演示使用,无意义。
2. 确认编写无误后再保存:编写好后,注释掉第一句和最后一句,去掉第二三行的注释。(编写好后最好是先验证MATLAB程序是否能正常运行,否则在MFC中运行到此函数后会停止运行或者显示不出想要的结果)
3. 将MATLAB程序恢复到第一步并保存
4. 编译MATLAB程序
在MATLAB命令行中输入mex -setup, 出现如下提示:
因为我需要用VS2017调用,理论上我应该选用下面框选的,但是看后面的路径似乎不对(还没试过直接选择这一条命令对不对,可自行试试,语言要选择C++)
再查看了Microsoft Visual C++ 2015 (C)路径下的文件,有支持VS2017的
所以在命令行输入mex -setup:D:\Matlab2018b\2018b\bin\win64\mexopts\msvc2017.xml C++此条命令是复制了VS2015的路径,然后将2015改为2017,C改为C++,出现如下提示
然后再输入mcc -W cpplib:draw -T link:lib test.m,其中draw是编译后生成的相关文件名,test.m是自己写的MATLAB程序的文件名,函数名仍为test,输入后,稍等数十秒
出现如上提示表示成功,再查看.m文件夹下出现了我们需要的文件
二、在VS中新建MFC工程调
1.新建一个MFC单文档工程,并添加菜单栏按钮,再为其添加相应的处理函数
2. 配置工程
打开“项目-》xxx属性-》VC++目录-》包含目录”添加MATLAB安装文件夹下的"\extern\include"
打开“项目-》xxx属性-》VC++目录-》库目录”添加MATLAB安装文件夹下的"\extern\lib\win64\microsoft"
打开“项目-》xxx属性-》链接器-》输入”添加libmat.lib libeng.lib libmx.lib mclmcrrt.lib draw.lib
然后将MATLAB程序编译后的如下四个文件添加到MFC工程目录下,其中draw.ctf在V2目录下
然后在要调用此函数的Cpp文件里添加 draw.h 和 math.h,到此就可以成功编译MFC工程
3. 在新添加的菜单栏按钮处理函数中添加相应的调用代码(注意函数参数除了第一个为int类型,表示返回参数的个数,其余参数都是mwArray类型,需要转换)
void CMainFrame::Ontest()
{
// TODO: 在此添加命令处理程序代码
if (Open_Soft == 0)//打开软件后只需要初始化一次
{
if (!mclInitializeApplication(NULL, 0))
{
AfxMessageBox(_T("Could not initialize !"));
return;
}
Open_Soft++;
}
if (!drawInitialize())//文件名+Initialize构成
{
AfxMessageBox(_T("Could not initialize !"));
return;
}
返回参数/
mwArray sum;
生成横坐标数据///
double xx[80];//横坐标
for (int i = 0; i < 80; i++)
{
xx[i] = -4 + 0.1*i;
}
mwArray x(80, 1, mxDOUBLE_CLASS, mxREAL);//80*1的矩阵
x.SetData(xx, 80);//将xx数组的值赋值给矩阵x,80是xx的长度
生成纵坐标数据///
double yy[80];//纵坐标
for (int j = 0; j < 80; j++)
{
yy[j] = sin(xx[j]);
}
mwArray y(80, 1, mxDOUBLE_CLASS, mxREAL);
y.SetData(yy, 80);
/调用绘图//
test(1, sum, x, y);//调用
/获取返回参数,此处返回参数是一个1*1的矩阵///
int sum_rec[1];
sum.GetData(sum_rec, 1);
CString rec; rec.Format(_T("返回参数为:rec = %d"), sum_rec[0]);
AfxMessageBox(rec);
//结束调用///
drawTerminate();
}
最后编译运行此工程后,在VS界面右下角取消Win32 Exception的勾选
结果如图:返回参数正确,曲线正确(点击下图中确定后,会结束调用,图像会消失,如果不想图片自动消失,可将上面程序中最后一行注释掉://drawTerminate();)
百度云盘链接:https://pan.baidu.com/s/1OfJxvYYtxlyBcmpop_wQ0Q
提取码:j0np
CSDN下载链接:https://download.csdn.net/download/weixin_41303441/12048635