侧边栏壁纸
  • 累计撰写 119 篇文章
  • 累计创建 60 个标签
  • 累计收到 7 条评论

目 录CONTENT

文章目录

MATLAB如何导出C/C++可以调用的动态库DLL

码峰
2022-09-28 / 0 评论 / 0 点赞 / 211 阅读 / 953 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-09-29,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

前言

MATLAB是用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域的一款强大的软件,里面包含了很多算法库,在MATLAB中开发了自己的算法后,希望在其他语言(C/C++/C#等)中使用设计好的算法,此时就需要将MATLAB的算法函数导出为动态库给其他语言调用。

导出过程

我以前的文章里介绍了使用matlab将其.m文件里的函数导出C/C++源代码供VC调用。https://blog.csdn.net/youyingbo/article/details/88556879
这种方式的优点是执行速度快,不依赖其他的库。但是,可能是基于保密的原因,有些matlab库函数不支持转成C/C++源代码。比如下边这个拟合圆的函数里就有两个matlab的库函数不支持转成源代码:
image-1664433783846

image-1664433799311

这时候只能将.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文件名要保持一致。
    image-1664434305628

  • 库文件生成后产生的文件如下:
    image-1664434331838

VS中引用动态库到C/C++工程

新建vc工程,设置runtime引用头文件及相关库,将生成的dll,lib,.h文件拷贝至工程目录,将.h文件添加至工程。
image-1664434373842
image-1664434383298
其中,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

0

评论区