如何vs2010mfc调用matlab 2010生成dll进行编程

作者&投稿:住菲 (若有异议请与网页底部的电邮联系)
如何vs2010调用matlab 2010生成dll~

首先matlab要安装64位的,一般在64位系统下默认安装64位。
在Matlab中运行mbuild -setup,选择64位的编译器。这个要配合vs2010的安装进行,vs2010中需要有64的编译器。
首先,写一个很简单的加法函数:
function [c] =Add(a, b);
c = a + b;
保存为Add.m
然后进行编译,命令如下:
mcc -W cpplib:libAdd -T link:lib Add
其中,mcc是matlab提供的编译命令,此命令的帮助说明如下:
-W lib:string link:lib
-W是控制编译之后的封装格式,cpplib,是指编译成C++的lib,cpplib后面是指编译的库的名字,-T表示目标,link:lib表示要连接到一个库文件的目标,目标的名字是后面的Add,即自定义m函数的名字。
运行完之后,你的目录下面,将会出现一些文件:
libAdd.cpp
libAdd.lib
libAdd.dll
libAdd.h等
libAdd.dll是编译好的动态库,Add这个函数封装在里面,libAdd.h是对应的头文件,在C里面调用这个函数的时候,需要include这个头文件,在这个头文件的最后,你可以看到下面的内容:
externLIB_libAdd_CPP_API void MW_CALL_CONV Add(int nargout, mwArray& c
, const mwArray&a
, constmwArray& b);
这就是Add的C函数的声明。
nargout表示输出变量的个数
a,b,c就是对应了m函数的几个变量
注意,a,b,c三个变量的类型是mwArray,这是matlab提供的一个特殊的变量类型(在7.0的版本,编译之后,变量类型是mxArray)。

通常在实现图像处理的算法时我们使用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
#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编程,因为它具有丰富的库函数以及操作方便,然而在工程项目中通常使用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()一定要!

如何vs2010mfc调用matlab 2010生成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 这里的选项...

如何使用vs2010mfc应用程序
答:方法/步骤 1 运行vs2010 双击运行vs2010开发工具。2 新建项目 在弹出的窗口中选择文件,然后选择新建,最后选择项目。3 选择MFC应用程序 在弹出的窗口中的已安装模板选择MFC,在右侧选择MFC应用程序。4 设置工程名和存储路径 在下面的名称处输入工程的名,在位置处输入工程在磁盘上的位置。5 下一步 在...

vs2010使用main函数
答:如果建立的是Win32控制台的话,直接可以看到main(),如果建立的是Win32程序的话,有一个WinMain()是入口函数。如果建立的MFC的话,它被MFC框架隐藏了,还是别找了,即便没有main(),MFC的运行结构也是很明晰的,基本上从构造CWinApp开始,自己的初始化代码写在InitInstance里。

vs2010中 MFC中不同类中关于settimer定时器的调用
答:你这个貌似是视图类,可在视图初始化之后进行设置定时器,如voidCfightView::OnInitialUpdate(){CView::OnInitialUpdate();SetTimer(12,333,NULL);}OnTimer函数示例:if(12==nIDEvent){nMovex+=2;//定义为类成员变量,初始化为0,具体加减多少自定nMovey+=2;//同上Invalidate();//刷新视图,必...

VS2010建立的WIN32项目中怎么调用MFC
答:包含MFC的头文件 选中项目后,右键属性,接下来看图,使用MFC库

vs2010中的 CMFCRibbonStatusBar这个状态栏类怎么用?
答:创建MFC项目时,选择用ribbon 然后可以把CMFCRibbonStatusBar m_wndStatusBar改成public,或者写个method返回这个变量,以便从view类中获取m_wndStatusBar 再就是view类中添加mousemove的消息处理函数。。。然后这个函数差不多这样:int nOffsetX = GetScrollPos(SB_HORZ);int nOffsetY = GetScrollPos(SB_...

VS2010的MFC程序如何调用动态库文件(dll文件)?放在system32中仍然编译...
答:比如你现在是Debug,你可以放到Debug文件夹或者工程文件夹;你现在是Release, 你可以放到Release文件夹或者工程文件放到System32无法访问可能说明你的程序根本不需要去访问System32,虽然这不太可能。当然我可以认为楼主是在隐式调用dll, 显示调用失败系统不会报错。如果 你是要隐式调用已经知道库在何处和...

vs2010怎么创建一个基于对话框的MFC应用程序
答:方法/步骤 运行vs2010 双击运行vs2010开发工具。新建项目 在弹出的窗口中选择文件,然后选择新建,最后选择项目。选择MFC应用程序 在弹出的窗口中的已安装模板选择MFC,在右侧选择MFC应用程序。设置工程名和存储路径 在下面的名称处输入工程的名,在位置处输入工程在磁盘上的位置。下一步 在弹出的窗口中...

如何在vs2010中的MFC应用程序中实现读取文件
答://写CStdioFile f;if (f.Open(m_filename, CFile::modeCreate | CFile::modeWrite | CFile::modeNoTruncate | CFile::typeText)){f.SeekToEnd();str += _T("\r\n");setlocale(LC_CTYPE, "chs");f.WriteString((LPCTSTR)str);f.Close();return 1;}//读 CStdioFile f;if (f.Ope...

怎么在vs2010中修改mfc对话框控件
答:打开VS2010,新建一个基于对话框的项目,名字叫“Addition”。在添加新的静态文本框以前,先看看Toolbox视图是否显示了,如果没有显示,在菜单栏上点击View->Toolbox即可。为对话框添加一个静态文本框(Static Text)。在Toolbox中的Static Text上点下鼠标左键不放开,并拖到对话框上,模板上会出现一个...