matlab生成dll方法的心得体会

matlab生成dll方法的心得体会
matlab生成dll方法的心得体会

将MATLAB函数编译成dll 供VC调用的方法

1简介

1.1 MATLAB简介

MATLAB名字是由MATrix和LABoratory两词的前三个字母组合而成。是美国新墨西哥大学计算机科学系主任的Cleve Moler教授出于减轻学生编程负担的动机,为学生设计了一组调用LINPACK和EISPACK库程序的“通俗易用”的接口,此即用FORTRAN编写的萌芽状态的MATLAB。

经几年的校际流传,在Little的推动下,由Little、Moler、Steve Bangert合作,于1984年成立了MathWorks公司,并把MATLAB正式推向市场。

目前,MATLAB己经成为应用最广泛的科学工程计算软件,它广泛的应用于自动控制、数学运算、信号分析、图象处理、财务分析等各行各业。用MATLAB 编写的数学运算及图像处理等程序十分简单,在MATLAB里有大量的MATLAB 库函数,包括初等数学函数、线形代数函数、矩阵操作函数、数值计算函数、特殊数学函数、插值函数等等,还可以利用MATLAB的编译工具将m文件方便的转化为C\C++语言、可执行程序(exe)、动态连接库文件(dll)、COM组件等等,并可直接供C\C++语言调用。

为什么要用VC与MATLAB接口?

既然MATLAB拥有强大的数值计算功能,利用VC与MATLAB接口可以充分发挥它的数值计算功能,并且可以不依赖MATLAB软件运行,在VC下做出漂亮的界面,把复杂的数据处理交给MATLAB去做。

1.2 MATLAB函数编译为dll与VC之间的通讯方式

1、使用自带的MATLAB Compiler

2、使用MATcom工具

3、在MATLAB下做com组件,在VC中调用com组件(出现了点问题,目前还没找到解决方法,这种方法在m文件较大、用matcom、调用math library 或使用mcc方式无法实现的时候,推荐使用)

2使用Matcom工具

2.1 MATcom简介

MATcom是MATHworks公司推出的第一个由MATLAB到C++的编译开发软件平台,其最新版本为4.5,集成调试编译环境为MIDEVA。

这个软件可厉害了,他生成的exe可执行文件可以在没有安装MATLAB的地方运行,只是需要几个dll文件而已。如果用MATLAB的Deployment Tool 来生成的exe可执行文件,在没有安装MATLAB的机子上运行时需要安装MCR,而MCR现在有200M 多,所以很不方便。

通过MATcom连接MATLAB m文件有以下三种方法:

(1)经过简单的设置,由MIDEVA将m源文件转换为C/C++,然后添加到VC工程中。

(2)由MIDEVA直接生成EXE文件,然后在VC中通过Shell调用。这种方法简单方便,但运行时出现一个控制台窗口,而且由于VC和MATLAB之间不能交互,通用性差,仅适用于VC调用MATLAB实现图形显示的场合。

(3)通过Visual MATcom工具条,使用Add-in,这种方法提供了MATLAB 和VC直接集成的途径,且可快速集成m文件到VC工程中创建独立的C/C++应用程序、C MEX DLL,在调试过程中可以查看矩阵变量的值,可直接修改m 源文件而不是修改生成的C/C++文件。

2.2 MATcom的安装

a) 安装之前,首先在matlab的安装目录下建立文件夹:\MATLAB7.0\bin\toolbox\matlab\general。matcom4.5在安装时需要你输入口令,Matcom4.5的口令为FREE-4.5-1191。

b) 之后启动MATLAB,运行以下命令:

cd c:\matcom45 % MATcom的安装路径

diary mpath

matlabpath

diary off

c)复制%MATcom45%\bin\usertype.dat文件到%VC%\Common\MSDev98\bin目录。

d) 运行Visual C++,并从菜单中选择Tools->Customize->Add-ins and Macro Files,选择Browse,改变文件类型为Add-in(.dll),选择%MATcom45%\bin\mvcide.dll文件,确定。

e) 在Visual C++的开发环境中可以看到一个Visual MATcom工具条,安装成功。

2.3 Matcom的工作原理

Matcom编译.m文件是先将.m文件按照与Matcom的Cpp库的对应关系,翻译为CPP源代码,然后用对应版本的C编译器将该CPP文件编译为exe或dll文件,所以,在第一次运行时让指定C Complier的路径是必需的,否则将无法编译。指定好的C Complier的信息写在Matcom/bin/matcom.ini文件中。但也有不足之处:比如,对struct等类的支持有缺陷,部分绘图语句无法实现或得不到准确图象,尤其是三维图象。

2.4使用Matcom将.m文件翻译为C++文件

a) 在MIDEVA下新建一个.m文件

function Test1()

x=-10:0.1:10;

y=sin(x);

plot(x,y);

在matcom安装路径Debug文件夹下将会产生以下文件:

从这里可以看出,MIDEVA己经将.m文件转化成c++代码,放在Test1.cpp 中。

b) 在VC中用MFC Wizard(exe)创建一个基于对话框名为Example的工程。

在面板上添加一个ID为IDC_BUTTON1按扭。

c) 将C:\matcom45\Debug目录下的Test1.cpp文件的内容拷贝到

void CExamleDlg::OnButton1()下;

d) 将C:\matcom45\lib\下的matlib.h和v4501v文件和C:\matcom45\debug 下的Test1.h文件拷贝到工程Example目录下,然后在VC中将库文件和头文件加入到工程中:工程->添加工程->Files,选择刚刚拷贝到Example目录下的matlib.h 、v4501v和Test1.h文件。

e)在ExampleDlg.cpp中加入如下代码:#include "matlib.h"

#include "Test1.h"

f)

2.5使用Matcom工具编译为dll文件供VC调用

在MIDEVA中新建一个.m文件,然后将其编译为.dll文件,

新建工程,File->New Project…,

设置组件属性,在"Component name"项中填写组件名称"component",这时候会自动生成类"component",在"Class name"项中填写类名称"huatu",为了便于区分,选中"Classes"中的"component",点击“remove”按钮,将类component移除,再点击"Add>>"添加新类huatu,结果如图5。点击"OK",接下来出现一个对话框,选择"Yes".

添加文件:选中左边工作区的"huatu",点击Project->Add File…,选择已经编辑好的函数文件huatu.m,如图所示。需要注意的是m文件必须是m函数,否则会报错,如果是m脚本文件的话,只需要改为无输入输出参数的m函数即可。

生成 com组件:点击Build->COM Object…,在这里出现了点问题,目前还不知道解决办法。

3 使用MATLAB 自带的Matlab Compiler

MATLAB Compiler 是MATLAB自带的一个编译器,它能将m文件转化成C、C++或p等各种类型的源代码,并根据需要生成可执行文件、lib文件(库文件)、dll文件或S函数文件等。Matlab所使用的编译器包括了MATLAB 的C\C++数学库函数以及图形库。

必须保证编译器的正确配置,因为编译器使用了C\C++库函数,所以在使用前需要使用 mex -setup 和 mbuild -setup两个命令对编译器进行配置。步骤如下:

1. 设置Matlab的编译器,使用外部的VC或者gcc等编译器。

2. 编译m文件成dll

3. 设置VC等的继承环境,设置C需要用到的静态库和动态库

4. 编写C调用dll

3.1设置Matlab编译器

首先要安装Matlab 编译器,一般来说,在安装了Matlab后编译器就己经安装了,所在就只需要对Matlab编译器进行设置。

3.1.1 编译环境设置

首先设置系统的环境变量,点击“我的电脑”属性-→系统特性--→高级-→环境变量-→添加系统变量Matlab值为Matlab的安装路径:G:\matlab7.0\bin\win32,重启电脑即可。

3.1.2 Matlab7.0 编译器设置

(a) 为编译后产生的MEX文件进行预配置

运行Matlab ,在Matlab 的命令窗口(Command Window) 键入“mex -setup ”命令后,按回车键,安装Matlab 编译器;

(b) 为产生独立外部应用程序进行预配置

对Matlab编译器mbuild应用程序进行设置,运行Matlab ,在Matlab 的命令窗口(Command Window) 键入“mbuild -setup ”命令后,按回车键,安装Matlab 编译器;

编写Matlab文件huatu_test.m,一个很简单的程序,

function [X1,Y1]=huatu_test(x1,x2)

x=x1:0.1:x2;

y=sin(x);

X1=rand(1);

Y1=rand(1);

plot(x,y,X1,Y1,'*');

end

3.2 将Matlab函数转成dll函数

在Matlab的Command Window /下输入命令:

命令1 :mcc -W lib:dlltest -T link:lib huatu_test.m

命令 2 :mcc -W cpplib: dlltest -T link:lib huatu_test.m

其中,mcc是matlab提供的编译命令(可以理解为gcc),对于这一点,matlab 的帮助说明如下:

-W lib:string link:lib

其中-W是控制编译之后的封装格式,cpplib,是指编译成C++的lib,cpplib 冒号后面是指编译的库的名字,-T表示目标,link:lib表示要连接到一个库文件的目标,目标的名字是后面的你写的m函数的名字。

生成的文件将会保存在当前目录下,默认的当前目录为:MATLAB根目录\work,找到dlltest.h 、dlltest.lib和dlltest.dll文件,这三个文件是我们需要的。

3.3 M函数文件编译成DLL文件问题解决

1、Warning: No matching builtin function available for C:\MATLAB6.5\toolbox\simulink\simulink\set_param.bi

解决方法:

1)将\MATLAB6.5\toolbox\compiler\deploy\matlabrc.m 中的

81行set_param(0,'PaperType',defaultpaper);

82行set_param(0,'PaperUnits',defaultunits);

注释掉,或者干脆删掉。

2)在Matlab6.5 的命令窗口运行rehash toolboxcache

3)重新编译文件后即可运行。

2、mbuild –setup的错误

Error: Could not find the compiler “cl”on the DOS path,use mbuild to

configure your environment properly.

由于VC安装有误而导致此错误,在安装时必须选择默认路径,否则matlab 检测不到VC编译器的物理位置

3.4 dll 文件载入

在VC中新建一个名为ceshi基于对话框的工程,在工程中添加一个名为"测试"的button按钮。将dlltest.h 、dlltest.lib和dlltest.dll文件拷贝到当前工程目录下,并通过Project->Add To Project->Files 选择拷贝到当前目录下的三个文件,将文件引入工程。

在ceshiDlg.cpp文件中添加头文件dlltest.h

#include "dlltest.h"

打开dlltest.h文件,里面有有关函数的定义,找到其中三个函数:

extern mxArray * mlfHuatu_test(void);

extern void dlltestInitialize(void);

extern void dlltestTerminate(void);

从函数意思不难知道它们的作用,dlltestInitialize用来初始化dll库,dlltestTerminate用来结束调用dll, mlfHuatu_test为主程序执行函数。将三个函数拷贝到button响应代码中,进行修改:

void CCeshiDlg::OnButton1()

{

dlltestInitialize();

mlfHuatu_test();

dlltestTerminate();

}

4 在MATLAB下做com组件,在VC中调用com组件

COM(Component Object Model)组件对象模型,在Matcom里做 COM组件,步骤如下:

1、在matlab command window 输入如下命令:

>> comtool

出现com编辑界面,

5 两种方法比较

其实两种方法大致思路都一样,但是各自都有局限:

用Matlab自带的Compiler将.m文件转换成c++代码功能有很多限制:

1、不能转换脚本m文件,只能转换m函数;

2、不能使用matlab对象;

3、不能用input或者eval操作matlab空间变量;

4、不能动态地命名变量,然后用load或者save命令来操作;

5、不能处理具有嵌套调用其他m文件的m文件;

6、不能使用MATLAB内联函数;

另外用Matlab自带的编译器有版本限制,MATLAB6.5的编译器为3.0版本,MATLAB7.0的编译器为4.0版本,4.0版本的编译器对原编译器进行了很多改进,3.0很多方法都不再使用,如果在7.0版本上使用会出现错误。

问题:在VC6.0下怎样调用Matlab7.0下编译生成的dll文件?

问题:在Matcom里生成了dll文件,在VC中该怎样调用它?

问题:在Matlab7.0下生不成dll组件?

相关主题
相关文档
最新文档