环境:VS2010;matlab2014a
目标:用VS做一个MFC界面,调用matlab程序。
目录
步骤:1,将用matlab编译好的m文件放在,matlab安装目录bin文件夹下。
我的文件位置为:G:\matlab2014\Matalab 2014\anzhuang\bin
我的m文件[calcualte.m]为:
function y = calculate(a,b)
a1 = a;
b1 = b;
y = a1 + b1;
2,在bin文件下,打开cmd命令,输入
mex -setup C++
3,输入 【注意cpplib和cpp不同】
mcc -W cpplib:A -T link:lib calculate.m
等一会之后,会出现下图的几个文件,将箭头的几个文件【.dll .h .lib】,放在MFC创建工程下。
至此,matlab生成dll任务结束。
可能会遇到在用mcc命令时,license未完全破解的问题,这是个因为你的matlab版本没有完成破解成功,需要再找其他的matlab。
这块分为两个步骤:A,配置环境 B,调用程序;
A 配置环境
步骤1,将上面生成的三个文件,放在创建的工程下。我的位置如下:工程名字为Test【放在...\Test\Test下】
C:\Users\happy\Documents\Visual Studio 2010\Projects\Test\Test
步骤2,在项目头文件处,添加A.h文件。
右键->添加现有项->找到文件添加
在TestDlg.cpp下,写入头文件。
#include "A.h"
步骤3,打开项目属性,配置链接库等。
项目->Test属性->VC++目录->添加包含目录和库目录
包含目录有下面四个:在matlab安装目录下
库目录有三个:
添加之后,再添加链接库。
项目->Test属性->输入->附加依赖库
依赖库如下:
添加完成之后,点击确定即可。
说明:我看了很多博主的文章,在配置这里,可能添加的包含目录【我的有重复】和依赖库都没有这么多,但是在我这里,少一个都会报错。所以,我添加了很多依赖库。其中A.lib是mcc命令创建的。
步骤4,更改32位为64位。
因为刚开始创建的时候,是32位的,但是matlab是64位的,所以将MFC变成64的。
Debug->配置管理器->活动解决方案平台->新建->键入或选择新的平台->选择x64->确定
就会发现,已经从Win32改成了x64如图。
配置结束。
B调用matlab
创建了一个加法器,实现两个数相加,出来结果。
void CTestDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
int a1,b1,sum;
a1 = GetDlgItemInt(IDC_EDIT1);
b1 = GetDlgItemInt(IDC_EDIT2);
if(!AInitialize()){ \\初始化,必须有
CString s;
s = "未连接";
AfxMessageBox(s);
}
mwArray a(1, 1, mxINT32_CLASS);
mwArray b(1, 1, mxINT32_CLASS);
mwArray c(1, 1, mxINT32_CLASS);
a.SetData(&a1,1);
b.SetData(&b1,1);
calculate(1,c,a,b);
sum = c.Get(1,1);
SetDlgItemInt(IDC_EDIT3,sum);
ATerminate();
}
其中 mwArray是一种matlab与VS交互用的数据结构,其具体用法可以看下面这篇博客。需要注意的是,matlab数组是从1开始的,C++是从0开始的。
https://blog.csdn.net/wangrenbao123/article/details/70169029
编译之后,结果就是下图的效果。
遇到的问题总结:
1,配置步骤,必须按照步骤来,要不然会出现各种各样的错误。
2,我在运行的时候,遇到了这个异常:"settings::core::exception::NoSuchKey”,是由于matlab版本问题,要降低版本,我从2016a降到了2014a版本。