VS2017 MFC调用MATLAB2018b实现C++的混合编程
环境:VS2017、MATLAB2018b 64bit、 win10 64bit
语言:C++
说明:本文中以调用MATLAB绘图为例,且本工程只能在MFC Release x64下运行,若想在x86下运行,需下载32位MATLAB,重新编译配置工程等等。
两大步骤:
- 在MATLAB中编写自定义函数,并编译成VS能调用的文件(.lib .dll .h等)
- 在VS中新建MFC工程调
一、在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
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
