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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值