我以前的文章里介绍了使用matlab将其.m文件里的函数导出C/C++源代码供VC调用。https://blog.csdn.net/youyingbo/article/details/88556879
这种方式的优点是执行速度快,不依赖其他的库。但是,可能是基于保密的原因,有些matlab库函数不支持转成C/C++源代码。比如下边这个拟合圆的函数里就有两个matlab的库函数不支持转成源代码:
这时候只能将.m文件里定义的函数直接转成dll调用。这种方式的缺点是调用时必须依赖matlab的runtime库,并且速度较慢。下面介绍下步骤:
1,安装编译器。我的机器上安装的是vs2015。也可以安装开源编译器,见:https://blog.csdn.net/youyingbo/article/details/88311537
2,导出
在命令窗口输入命令:
mex -setup
鼠标点击,选择mex -setup C++
mbuild -setup
鼠标点击,选择mex -setup C++ -client MBUILD
mcc -W cpplib:fitCircuit -T link:lib fitCircuit
完成,生成库文件。注意:fitCircuit是要导出的.m文件的文件名,且.m文件里的函数名和.m文件名要保持一致。
库文件生成后产生的文件如下:
3,引用
新建vc工程,设置runtime引用头文件及相关库,将生成的dll,lib,.h文件拷贝至工程目录,将.h文件添加至工程。
其中,mclmcrrt.lib是runtime库,fitCircuit.lib是导出的库。
4,调用
4.1 通过runtime调用matlab导出的dll,需要初始化环境,因此要在程序启动时调用初始化环境函数,此函数定义在matlab头文件mclmcrrt.h中,注意此函数只能在程序启动时调用一次,调用多次会出错。
if (false == mclInitializeApplication(NULL, 0))
{
AfxMessageBox("Initialize application error.");
return FALSE;
}
4.2 程序退出时结束环境
TerminateApplication();
4.3 调用函数
查看上边matlab生成的头文件:fitCircuit.h
依次调用如下三个函数实现对应功能:
// 函数初始化
bool MW_CALL_CONV fitCircuitInitialize(void);
// 目标函数
extern LIB_fitCircuit_CPP_API void MW_CALL_CONV fitCircuit(int nargout, mwArray& R, const mwArray& XY_data);
// 结束函数
void MW_CALL_CONV fitCircuitTerminate(void);
其中nargout是函数准备输出参数的个数,由函数实际情况决定,本例子参数赋值为1,表示只输出一个参数:圆的半径(没搞清楚此参数用意,按理说函数输出参数个数是确定的);mwArray是matlab自定义变量,代表着向量,一维向量初始化如下(二维依此类推):
double buffer[100];
mwArray output(100, 1, mxDOUBLE_CLASS);
output.SetData(buffer, 100);