
下面以一个简单的小例子演示Matlab调用DLL的过程:
1、编译器准备
在Matlab的命令窗口输入:mex -setup
选择你的编译器,我的是:
[2] Microsoft Visual C++ 2008 SP1 in c:\Program Files\Microsoft Visual Studio 9.0
2、编写你自己的DLL
在Visual Studio 2008中新建一个Win32的Dll工程,不妨设名字为MatlabDllTest
编辑MatlabDllTest.cpp:
#include "MatlabDllTest.h"
double add(double x, double y)
{
return (x+y)
}
编辑MatlabDllTest.h:
#ifndef MATLABDLLTEST_H
#define MATLABDLLTEST_H
#ifdef __cplusplus
extern "C"
{
#endif
__declspec(dllexport) double add(double x, double y)
#ifdef __cplusplus
}
#endif
#endif
3、加载DLL:把编译连接之后产生的MatlabDllTest.dll和MatlabDllTest.h文件拷贝到Matlab的当前工作目录下,输入
loadlibrary('MatlabDllTest','MatlabDllTest.h')
(一定要有这步,如果dll不成功,会显示错误原因)
4、查看DLL中导出的函数
libfunctions MatlabDllTest -full
-full选项会列出导出函数的详细输入和输出参数,这是输出信息如下:
Functions in library MatlabDllTest:
double add(double, double)
5、调用函数
calllib('MatlabDllTest', 'add', 1.3, 4.6)
此时就会输出正确的结果
ans =
5.9000
总结:这个例子比较简单,只是为了演示整个过程,如果真的用到了Matlab来调用外部DLL的这种方式的话,就要注意DLL工程要符合Matlab的要求,详细信息请自己查看Matlab的帮助文件。
通常在实现图像处理的算法时我们使用Matlab编程,因为它具有丰富的库函数以及 *** 作方便,然而在工程项目中通常使用C/C++语言。如果我们将matlab代码完全重写成C++代码会很麻烦,最好的办法是借助matlab与C/C++接口将.m程序转成dll文件!一、使用matlab将.m转成dll文件
1、在命令行中输入mex -setup
提示你是否要在本地安装matlab compilers,然后选择compiler类型,有matlab自带的编辑器以及检测到的其他编辑器,比如“Microsoft Visual C/C++ version 6.0 in E:\Program Files\Microsoft Visual Studio”,根据自己实际情况选择。
2、在命令行中输入mbuild -setup
这里的选项和上面类似,依次选择环境确定。
3、生成dll文件
一句命令mcc -W cpplib:add -T link:lib add.m
前面的add表示生成的dll文件名,后面的add.m顾名思义是.m文件名。生成后会多出8个文件,有用的是add.ctfadd.dll add.lib add.h4个文件,据说新版的Matlab不会生成.ctf文件。
二、VC6.0中调用生成的dll文件
上面生成的dll文件,我们可以借助VC6.0的Depends工具查看导出函数名,但是我们要调用导出函数必须要知道函数的形参返回类型等,这里要借助.h文件,它包含了导出函数的声明,下面以实例来讲解使用方法:
1、add.m文件
function [a,b]=add(x,y)
a=2*x+y
b=3*y
end
注意了add函数有两个返回值,可以猜测一下在C++中是如何处理的;
2、add.h文件
截取其中一段关键代码如下:
extern void add(int nargout, mwArray&a, mwArray&b
, const mwArray&x, const mwArray&y)
实际上函数的返回是变相的放到形参中的,依次是输出参数个数,输出参数,输入参数。PS 现在做的这个项目中用户自定义算法dll使用的规则和这里类似!
3、C++中调用dll文件
(1)新建空工程,将上面提及的4个文件放到工程目录下;
(2)VC++目录中包含目录:matlab 内的include目录
比如我的是 E:\MATLAB7\extern\include
(3)VC++目录中库目录:matlab 内的lib目录
E:\MATLAB7\extern\lib\win32\microsoft\msvc60,要根据VC++版本修改!
(4)工程属性-》连接-》输入-》附加依赖项
输入:add.lib mclmcrrt.lib mclmcr.lib,第一个是生成的。或者在预处理中加入下面代码
#pragma comment(lib, "mclmcrrt.lib")
#pragma comment(lib, "mclmcr.lib")
#pragma comment(lib, "add.lib")
4、C++代码
#include <iostream>
#include "add.h"
using namespace std
int main()
{
if(!addInitialize())
{
cout<<"initilize failed!!!"<<endl
return -1
}
mwArray a(1,1,mxDOUBLE_CLASS)
mwArray b(1,1,mxDOUBLE_CLASS)
a(1,1)=20
b(1,1)=30
mwArray x(1,1,mxDOUBLE_CLASS)
mwArray y(1,1,mxDOUBLE_CLASS)
//输出参数个数,输出参数,输入参数。
add(2,x,y,a,b)
double *i=new double
double *j=new double
x.GetData(i,1)
y.GetData(j,1)
cout<<"x="<<*i<<" y="<<*j<<endl
getchar()
return 0
}
注意:addInitialize()一定要!
可以打包步骤如下:
MATLAB命令窗口输入deploytool,打开一个Eeployment Project的窗口:
1.在Name输入你想要打包后的文件的名字;
2.在Location输入你MATLAB当前的路径;
3.在Target选择第一项Windows Standalone Application
4.确定后打开Depolyment Tool窗口,在窗口中有一个[Add main file],点击就可以增加你要转换的文件,最后点击Package即可。
在未安装matlab的电脑上使用步骤:
首先从安装matlab的电脑上拷贝两个文件:
1.“MCRInstaller.exe”(在matlab安装目录“*:\Program Files\MATLAB\R2010b\toolbox\compiler\deploy\win32”下);
2.在生成的安装包中拷贝exe,如:生成的包中“...\zhytool\Untitled2\src”,找到Untitled2.exe。
然后将这两个exe文件考到未装matlab的新电脑上:
1.双击“MCRInstaller.exe”,所有选项默认,直至完成安装;
2.双击Untitled2.exe,可以使用。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)