MATLAB调用C++DLL
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MATLAB调用C++动态库的方法
声明:本人知识水平有限,文档中难免有错,望谅解!
一、方法步骤
1、首先确定你的动态库正确,并将你的动态库(例如:Demo.dll)和静态链接库
(Demo.lib)和自定义的相关头文件(例如:Demo.h等)拷贝到当前工作目录下,当然也可以将你的动态库拷贝到C盘的windows\system32目录下。
2、写.cpp文件,并用mex命令生成.mexw64或者.mexw32文件(这由你的系统决定),
其实,这个文件起转换作用。也就是说,你用MATLAB调用C++动态库就必须通过
这个文件去调用,而这个文件就是由.cpp文件生成的。
这个.cpp文件中必须包含这个mexFunction函数,格式也必须如下:
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
nlhs:输出参数个数
plhs:输出参数列表
nrhs:输入参数个数
prhs:输入参数列表
不过函数名可以随便取的。在这个函数中你就可以去调用C++动态库的函数了。
记住头文件:”mex.h”……
注意:保存的文件名就是将来在MATLAB中调用的函数名,而不是这里的函数名。
3、使用mex命令编译XXX.cpp。如:mex xxx.cpp ;那么系统将生成xxx.mexw32或者xxx.mexw64
文件。这个文件的文件名就将是你要调用的函数名;
4、现在就可以写脚本调用这个函数了。
二、案例
1、现在生成了一个C++动态库Demo.dll\Demo.lib,还有头文件Demo.h;里面定义了一个函数
double Demo_Add( double x, double y); //功能:将两个数相加并返回
这些大家都知道,不用我说了吧。
2、在MATLAB中写一个c++文件Test.cpp:
#include "mex.h"
#include "Demo.h"
#pragma comment(lib,"Demo.lib")
void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
if( nrhs != 2) //判断输入参数的个数
{
mexErrMsgTxt("输入参数个数不对!");
}
//得到传入的第一个参数,并转换了double类型
double p1 = *((double*)mxGetPr(prhs[0]));
//得到传入的第二个参数,并转换了double类型
double p2 = *((double*)mxGetPr(prhs[1]));
//创建一个1*1的实时double类型的矩阵
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
//得到输出的第一个参数的指针
double *output = (double*)mxGetPr(plhs[0]);
//调用Demo.dll定义的函数实现功能,并将返回值给输出参数
*output = DEMO_Add(p1, p2);
}
3、在当前工作目录下只用mex Test.cpp编译,编译成功将生成MEX文件,Test.mexw32
或者Test.mexw64.
5、那么现在你就可以通过Test这个函数名去调用Demo_Add函数了.
我现在就写一个脚本文件First.m:
clc
clear
tic
x = 1.6;
y = 2.7;
Test_add = Test(x, y)
toc
6、run这个脚本.MATLAB调用C++动态库就成功了….
Author : Li Jun
Date :2012-03-26