将MATLAB函数编译成dll供VC调用的方法1简介1.1MATLAB简介MATLAB名字是由MATrix和LABoratory两词的前三个字母组合而成。是美国新墨西哥大学计算机科学系主任的CleveMoler教授出于减轻学生编程负担的动机,为学生设计了一组调用LINPACK和EISPACK库程序的“通俗易用”的接口,此即用FORTRAN编写的萌芽状态的MATLAB。经几年的校际流传,在Little的推动下,由Little、Moler、SteveBangert合作,于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.2MATLAB函数编译为dll与VC之间的通讯方式1、使用自带的MATLABCompiler2、使用MATcom工具3、在MATLAB下做com组件,在VC中调用com组件(出现了点问题,目前还没找到解决方法,这种方法在m文件较大、用matcom、调用mathlibrary或使用mcc方式无法实现的时候,推荐使用)2使用Matcom工具2.1MATcom简介MATcom是MATHworks公司推出的第一个由MATLAB到C++的编译开发软件平台,其最新版本为4.5,集成调试编译环境为MIDEVA。这个软件可厉害了,他生成的exe可执行文件可以在没有安装MATLAB的地方运行,只是需要几个dll文件而已。如果用MATLAB的DeploymentTool来生成的exe可执行文件,在没有安装MATLAB的机子上运行时需要安装MCR,而MCR现在有200M多,所以很不方便。通过MATcom连接MATLABm文件有以下三种方法:(1)经过简单的设置,由MIDEVA将m源文件转换为C/C++,然后添加到VC工程中。(2)由MIDEVA直接生成EXE文件,然后在VC中通过Shell调用。这种方法简单方便,但运行时出现一个控制台窗口,而且由于VC和MATLAB之间不能交互,通用性差,仅适用于VC调用MATLAB实现图形显示的场合。(3)通过VisualMATcom工具条,使用Add-in,这种方法提供了MATLAB和VC直接集成的途径,且可快速集成m文件到VC工程中创建独立的C/C++应用程序、CMEXDLL,在调试过程中可以查看矩阵变量的值,可直接修改m源文件而不是修改生成的C/C++文件。2.2MATcom的安装a)安装之前,首先在matlab的安装目录下建立文件夹:\MATLAB7.0\bin\toolbox\matlab\general。matcom4.5在安装时需要你输入口令,Matcom4.5的口令为FREE-4.5-1193046-80295111。b)之后启动MATLAB,运行以下命令:cdc:\matcom45%MATcom的安装路径diarympathmatlabpathdiaryoffc)复制%MATcom45%\bin\usertype.dat文件到%VC%\Common\MSDev98\bin目录。d)运行VisualC++,并从菜单中选择Tools-Customize-Add-insandMacroFiles,选择Browse,改变文件类型为Add-in(.dll),选择%MATcom45%\bin\mvcide.dll文件,确定。e)在VisualC++的开发环境中可以看到一个VisualMATcom工具条,安装成功。2.3Matcom的工作原理Matcom编译.m文件是先将.m文件按照与Matcom的Cpp库的对应关系,翻译为CPP源代码,然后用对应版本的C编译器将该CPP文件编译为exe或dll文件,所以,在第一次运行时让指定CComplier的路径是必需的,否则将无法编译。指定好的CComplier的信息写在Matcom/bin/matcom.ini文件中。但也有不足之处:比如,对struct等类的支持有缺陷,部分绘图语句无法实现或得不到准确图象,尤其是三维图象。2.4使用Matcom将.m文件翻译为C++文件a)在MIDEVA下新建一个.m文件functionTest1()x=-10:0.1:10;y=sin(x);plot(x,y);在matcom安装路径Debug文件夹下将会产生以下文件:从这里可以看出,MIDEVA己经将.m文件转化成c++代码,放在Test1.cpp中。b)在VC中用MFCWizard(exe)创建一个基于对话框名为Example的工程。在面板上添加一个ID为IDC_BUTTON1按扭。c)将C:\matcom45\Debug目录下的Test1.cpp文件的内容拷贝到voidCExamleDlg::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中加入如下代码:#includematlib.h#includeTest1.hf)2.5使用Matcom工具编译为dll文件供VC调用在MIDEVA中新建一个.m文件,然后将其编译为.dll文件,新建工程,File-NewProject…,设置组件属性,在Componentname项中填写组件名称component,这时候会自动生成类component,在Classname项中填写类名称huatu,为了便于区分,选中Classes中的component,点击“remove”按钮,将类component移除,再点击Add添加新类huatu,结果如图5。点击OK,接下来出现一个对话框,选择Yes.添加文件:选中左边工作区的huatu,点击Project-AddFile…,选择已经编辑好的函数文件huatu.m,如图所示。需要注意的是m文件必须是m函数,否则会报错,如果是m脚本文件的话,只需要改为无输入输出参数的m函数即可。生成com组件:点击Build-COMObject…,在这里出现了点问题,目前还不知道解决办法。3使用MATLAB自带的MatlabCompilerMATLABCompiler是MATLAB自带的一个编译器,它能将m文件转化成C、C++或p等各种类型的源代码,并根据需要生成可执行文件、lib文件(库文件)、dll文件或S函数文件等。Matlab所使用的编译器包括了MATLAB的C\C++数学库函数以及图形库。必须保证编译器的正确配置,因为编译器使用了C\C++库函数,所以在使用前需要使用mex-setup和mbuild-setup两个命令对编译器进行配置。步骤如下:1.设置Matlab的编译器,使用外部的VC或者gcc等编译器。2.编译m文件成dll3.设置VC等的继承环境,设置C需要用到的静态库和动态库4.编写C调用dll3.1设置Matlab编译器首先要安装Matlab编译器,一般来说,在安装了Matlab后编译器就己经安装了,所在就只需要对Matlab编译器进行设置。3.1.1编译环境设置首先设置系统的环境变量,点击“我的电脑”属性-系统特性--高级-环境变量-添加系统变量Matlab值为Matlab的安装路径:G:\matlab7.0\bin\win32,重启电脑即可。3.1.2Matlab7.0编译器设置(a)为编译后产生的MEX文件进行预配置运行Matlab,在Matlab的命令窗口(CommandWindow)键入“mex-setup”命令后,按回车键,安装Matlab编译器;(b)为产生独立外部应用程序进行预配置对Matlab编译器mbuild应用程序进行设置,运行Matlab,在Matlab的命令窗口(CommandWindow)键入“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,'*');end3.2将Matlab函数转成dll函数在Matlab的CommandWindow/下输入命令:命令1:mcc-Wlib:dlltest-Tlink:libhuatu_test.m或命令2:mcc-Wcpplib:dlltest-Tlink:libhuatu_test.m其中,mcc是matlab提供的编译命令(可以理解为gcc),对于这一点,matlab的帮助说明如下:-Wlib:stringlink:lib其中-W是控制编译之后的封装格式,cpplib,是指编译成C++的lib,cpplib冒号后面是指编译的库的名字,-T表示目标,link:lib表示要连接到一个库文件的目标,目标的名字是后面的你写的m函数的名字。生成的文件将会保存在当前目录下,默认的当前目录为:MATLAB根目录\work,找到dlltest.h、dlltest.lib和dlltest.dll文件,这三个文件是我们需要的。3.3M函数文件编译成DLL文件问题解决1、Warning:NomatchingbuiltinfunctionavailableforC:\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的命令窗口运行rehashtoolboxcache3)重新编译文件后即可运行。2、mbuild–setup的错误Error:Couldnotfindthecompiler“cl”ontheDOSpath,usembuildtoconfigureyourenvironmentproperly.由于VC安装有误而导致此错误,在安装时必须选择默认路径,否则matlab检测不到VC编译器的物理位置3.4dll文件载入在VC中新建一个名为ceshi基于对话框的工程,在工程中添加一个名为测试的button按钮。将dlltest.h、dlltest.lib和dlltest.dll文件拷贝到当前工程目录下,并通过Project-AddToProject-Files选择拷贝到当前目录下的三个文件,将文件引入工程。在ceshiDlg.cpp文件中添加头文件dlltest.h#includedlltest.h打开dlltest.h文件,里面有有关函数的定义,找到其中三个函数:externmxArray*mlfHuatu_test(void);externvoiddlltestInitialize(void);externvoiddllt