matlab函数编译dll,vs调用该dll的方法

将matlab的.m文件编译成dll的步骤:

本文只介绍使用deploytool工具编译的方法

  1.   键入deploytool命令,打开deploytool工具

matlab函数编译dll,vs调用该dll的方法

matlab函数编译dll,vs调用该dll的方法

选择第三个选项“Library Compiler"

matlab函数编译dll,vs调用该dll的方法

左上角选择"C++ Shared Library",旁边”Add exported functions"右边点击加号添加要导出的函数,可以添加多个

matlab函数编译dll,vs调用该dll的方法

添加了.m函数后,最右边的"Package"变为绿色可选状态,点击它就可以生成dll了

matlab函数编译dll,vs调用该dll的方法

2  vs调用方法

本文采用vs2015,dll采用显示调用方式(主要是嫌麻烦,只要一个dll,不用.h和.lib文件。)

  • 新建一个调用dll的测试控制台项目
  • 包含matlab 与c++的接口sdk
定位到:右键项目-属性-VC++目录-包含目录,添加..\MATLAB\R2017a\extern\include

库目录添加:..\MATLAB\R2017a\extern\lib\win64\microsoft

matlab函数编译dll,vs调用该dll的方法

链接器-输入-附加依赖项,添加以下几个lib

mclmcr.lib
mclmcrrt.lib

libmx.lib

libmex.lib

libmat.lib

libeng.lib

测试主函数

用deploytool生成dll时,也会生成.h文件,里面有用到的函数声明

如果要使用某个函数,先调用初始化函数(.h文件里面有它的声明),再调用你的功能函数

具体见下面的测试函数,这个是一个图像处理函数,哈哈


//MeterRecognizeDLL调用测试20180201
//采用mexFunction
void FuncMeterRecognizeDLL(cv::Mat I)
{
HINSTANCE h = LoadLibraryA("MeterRecognizeDLL.dll");

//DLL初始化函数
typedef bool(*pInitialize)(void);//初始化函数
pInitialize Initialize = NULL;
Initialize = (pInitialize)GetProcAddress(h, "MeterRecognizeDLLInitialize");//函数声明在.h文件里面

//MeterRecognizeDLL功能函数
typedef bool(*pmlx)(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[]);//mlxMeterRecognizeDLL函数声明在.h文件里面
pmlx mlxMeterRecognizeDLL = NULL;
mlxMeterRecognizeDLL = (pmlx)GetProcAddress(h, "mlxMeterRecognizeDLL");


if (!Initialize()) //初始化,必需要有,不要怀疑哦
{
// system("pause");
cout << "Could not initialize" << endl;
exit(0);
}

// I是opencv图像数据结构
mxArray *是matlab c++形式的矩阵指针。
如何转换呢?
先定义一个mxArray *指针
int M = I.rows; //图像的行数
int N = I.cols; //图像的列数
mxArray * pmxArray = mxCreateDoubleArray(M,N,mxREAL);
double* prmxArray = mxGetPr(pmxArray );
//I.data是opencv图像的头指针,prmxArray是matlab矩阵的头指针,使用memcpy将opencv图像数据复制到matlab矩阵当中
memcpy((double*)I.data,prmxArray ,sizeof(double)*M*N);

mxArray * ptArrayIn0 = cvMat2pMxArrayDouble(I);//输入

mxArray* ptArrayOut0 = mxCreateDoubleMatrix(1, 1, mxREAL);//输出
double *prOut0 = mxGetPr(ptArrayOut0);
*prOut0 = 0;

int nlhs = 1; //左边参数个数,即输出参数个数
 mxArray *plhs[] = { ptArrayOut0 };//输出
int nrhs = 1; //右边参数个数,即输入参数个数
mxArray*prhs[] = { ptArrayIn0 };//输入

mlxMeterRecognizeDLL(nlhs, plhs, nrhs, prhs);// 功能函数
输出结果在plhs中
plhs[0]:mxArray* 类型,第一个输出参数,依次类推,plhs[1],第二个
比如,查看输出结果
double* prOut0 = mxGetPr(plhs[0]);
for (int i=0;i <M*N;i++)
 cout<<*prOut0(i++)<<endl;

cv::Mat BW = pMxArrayDouble2cvMat(plhs[0]); //

}

整个过程中,可能会出现一些错误:







matlab函数编译dll,vs调用该dll的方法matlab函数编译dll,vs调用该dll的方法