MATLAB如何导出C/C++可以调用的动态库DLL
前言
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
相关文章
- 【说站】java动态和静态语言的比较
- 【说站】java动态绑定怎么用
- 【说站】java动态代理的原理
- 【说站】python动态存取属性如何实现
- 【说站】python动态规划算法的使用过程
- 【说站】java动态绑定如何理解?
- 【说站】java静态和动态绑定的对比
- 【说站】java动态规划是什么
- 【说站】Java数组如何实现动态初始化
- 【说站】java动态代理如何实现?
- fastadmin 动态下拉组件 SelectPage
- Vue组件之动态组件
- apache常见错误:VC运行库(找不到 VCRUNTIME140.dll)
- 解决Vue动态组件数据更新不及时问题
- 如何将python写的程序打包成DLL动态库
- JS动态操控CSS样式:赋予网页无限生机
- Web前端如何高效使用ECharts:打造动态可视化图表的实战指南