前言
MATLAB是用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域的一款强大的软件,里面包含了很多算法库,在MATLAB中开发了自己的算法后,希望在其他语言(C/C++/C#等)中使用设计好的算法,此时就需要将MATLAB的算法函数导出为动态库给其他语言调用。
导出过程
我以前的文章里介绍了使用matlab将其.m文件里的函数导出C/C++源代码供VC调用。https://blog.csdn.net/youyingbo/article/details/88556879
这种方式的优点是执行速度快,不依赖其他的库。但是,可能是基于保密的原因,有些matlab库函数不支持转成C/C++源代码。比如下边这个拟合圆的函数里就有两个matlab的库函数不支持转成源代码:
这时候只能将.m文件里定义的函数直接转成dll调用。这种方式的缺点是调用时必须依赖matlab的runtime库,并且速度较慢。下面介绍下步骤:
安装编译器。
我的机器上安装的是vs2015。也可以安装开源编译器,见:https://blog.csdn.net/youyingbo/article/details/88311537
通过命令导出
在命令窗口输入命令:
mex -setup
- 鼠标点击,选择mex -setup C++
mbuild -setup
- 鼠标点击,选择mex -setup C++ -client MBUILD
mcc -W cpplib:fitCircuit -T link:lib fitCircuit
-
完成,生成库文件。注意:fitCircuit是要导出的.m文件的文件名,且.m文件里的函数名和.m文件名要保持一致。
-
库文件生成后产生的文件如下:
VS中引用动态库到C/C++工程
新建vc工程,设置runtime引用头文件及相关库,将生成的dll,lib,.h文件拷贝至工程目录,将.h文件添加至工程。
其中,mclmcrrt.lib是runtime库,fitCircuit.lib是导出的库。
在C/C++代码中调用
通过runtime调用matlab导出的dll,需要初始化环境,因此要在程序启动时调用初始化环境函数,此函数定义在matlab头文件mclmcrrt.h中,注意此函数只能在程序启动时调用一次,调用多次会出错。
if (false == mclInitializeApplication(NULL, 0))
{
AfxMessageBox(Initialize application error.);
return FALSE;
}
程序退出时结束环境
TerminateApplication();
调用函数
查看上边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);
以上导出过程的内容摘抄自CSDN博客,有通过排版整理。
版权声明:本文为CSDN博主「tiger波波」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/youyingbo/article/details/103360878