C++和MATLAB混合编程-DLL篇
作者:网络转载 发布时间:[ 2014/6/30 13:43:40 ] 推荐标签:C++ net
这是plotdata.h中主要的函数。plotdataInitialize(void)可以看出是初始化的函数。如果是隐式链接DLL好先调用此函数,判断返回值否则很可能加载不到dll,而在显式链接时,如果没有加载函数成功,也不会直接报错,但我们可以在单步调试时看函数是否为分配了内存(即是否为null)。plotdataTerminate(void)是终止动态链接库的函数。
mlxPlotdatat与mlfPlotdata是关键的两个接口,也是我们要加载的函数。他们执行的功能与m文件中plotdata函数是一样的。两个函数输入参数不同:
mlxPlotdata(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[]); 其中 nlhs,plhs分别表示输出参数的个数及输出参数的mxArray数组;nrhs,prhs表示输入参数的个数及输入参数数组。(这个函数有点通用的感觉……)
mlfPlotdata(mxArray* rgbData); 简单的多,基本和m文件中你定义的plotdata函数是一样的(我的plotdata定义为 function []=plotdata(rgbData))
所以一般在程序中加载的是mlf开头的函数。
这里需要提的是我编译生成的是C的动态链接库。如果是生成C++的动态链接库,生成的接口函数也带有一个mlx开头的函数,即
bool MW_CALL_CONV mlxPlotdata(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[])
但是另一个函数是不带有mlf的,直接为
void MW_CALL_CONV plotdata(const mwArray& rgbData)
而且输入参数不是mxArray数组,而是mwArray数组,这也是C和C++与MATLAB混合编程时主要的不同(下篇再详细说)
但是我在尝试C++动态链接时一直没有成功。后来看到生成的cpp文件同c文件一样也有一个 extend "C"{},这是C++为了与C兼容而提供的一个关键字,C++编译器将会在extend "C"的大括号内部代码当做C语言代码处理,这让我很困惑……而如果注释掉又会报连接错误
想来可能是MATLAB对C++编译支持并不好(他自带的lcc编译器是只能编译成C的接口)总之没有尝试成功,暂时在程序中都用C的动态链接了。

sales@spasvo.com