如何调用matlab生成的dll文件进行编程
1个回答
展开全部
通常在实现图像处理的算法时我们使用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将.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()一定要!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询