vs2015调用matlab .m文件函数
步骤一:
其中:.h,.lib和 .dll三个文件才是需要的,将其拷贝到vs工程目录中即可。
1,mex -setup设置编译器C++
2,mbuild -setup设置编译器C++
步骤二:
1,写matlab文件,需要将主文件写成函数的形式,即使主文件中调用了其他函数,在后面的mcc中依然会编入dll中,故不需要担心,
例子:主程序
function r=You(a,b)
r=Add(a,b); //子函数加
r=Cheng(r,r); //子函数乘
end
2,编译matlab程序:
mcc -W cpplib:libYou -T link:lib You.m
注解:libYou:最终生成的文件名
You.m:matlab主文件名
3,生成文件如下:
步骤三:环境配置(重要)
1,
Step1:在系统环境变量的Path中添加“Matlab安装目录\bin\win64;”
Step2:在项目属性中的VC++目录下的包含目录添加“Matlab安装目录\extern\include;”
Step3:在项目属性中的VC++目录下的库目录添加“Matlab安装目录\extern\lib\win64\microsoft;”
2,
项目属性--链接器---输入----附加依赖项-中添加以下库名
libmat.lib
libmex.lib
mclmcr.lib
mclmcrrt.lib
libemlrt.lib
libeng.lib
libfixedpoint.lib
libcovrt.lib
步骤四:代码测试
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include "matrix.h"
#include "libYou.h"
using namespace std;
#pragma comment(lib,"libYou.lib") //静态的加入库文件,,,当然也可以在附件依赖项中直接添加
int main()
{
int jieguo;
if (!libYouInitialize()) //初始化 动态链接库,这一步是必须的
{
printf("Could not initialize addfunction!");
exit(0);
}
printf("OK!");
mwArray result(1, 1, mxDOUBLE_CLASS, mxREAL); //一行一列的矩阵
mwArray a(1, 1, mxDOUBLE_CLASS, mxREAL);
//一行一列的矩阵
mwArray b(1, 1, mxDOUBLE_CLASS, mxREAL);
//一行一列的矩阵
double data1 = 2; double data2 = 3;
a.SetData(&data1, 1); //赋值
b.SetData(&data2, 1);
//赋值
result.SetData(&data2, 1);
//赋值
You(1, result, a, b); //调用自己用matlab写的函数结果返回到
//获取结果result中
printf("%d\n", jieguo); //打印输出(这里是控制台程序)
libYouTerminate(); //使用完库,必须关掉
return 0;
}
步骤五:注意的问题,发现的问题
问题一,
libYouInitialize()函数是初始化库,此函数是在libYou.h中,实际上是mcc编译合成的,如果初始化库失败,一个原因可能是mcc没有编译好,重新编译一次就好,我就是遇到这种问题。另一个原因可能是系统环境变量没设好,有冗余(重复)。
问题二:程序可以运行,但是调试不行,发生问题-----
0x0000020298E70D55 处(位于 test_add_matlab.exe 中)引发的异常: 0xC0000005: 读取位置 0x0000000000000008 时发生访问冲突-----
这种类似的问题,主要发生在
libYouInitialize()函数,解决办法是,vs2015调试时,有异常设置选项卡,,将里面的win32 exception去掉勾选即可。。
问题三,不管是mcc还是
libYouInitialize()都很花时间,注意有耐心。。。