matlab导出dll动态库

       我以前的文章里介绍了使用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);

 

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值