matlab生成dll

2017-01-17  by:CAE仿真在线  来源:互联网

实验室的一个项目需要调用matlab程序。经过再三考虑,决定使用vc调用matlab导出库的形式。而我主要负责与matlab程序结合的工作。以下是今天工作的简要总结。全当是个备忘吧。

1:在matlab中选择compiler。

在命令行窗口输入:mex -setup

按照提示选择vc6.0.由于使用的是matlab7,不识别vs2010和2008,无奈有装的vc6.0。但听说最新版的matlab可以识别。

2:选择builder.

输入:mbuild -setup

同样选择vc6.0

3:生成dll。

输入:mcc -W cpplib:mydll -T link:lib test.m


众所周知Matlab的强大运算能力让各种工程软件望而却步,而VC程序的友好界面又让人爱不释手,如果能够让两者的优势结合起来的话,势必能让程序员欢欣鼓舞。还好MathWorks已经为我们想到了,基本上现在市面上主流的Matlab版本都可以支持VC和Matlab的混合编程。但是目前网上资料基本上都是基于Matlab 6.0和VC 6.0的,和新版本的实现方法有所不同,因此笔者通过不断的尝试和研究,终于调试通了基于VS2008和Matlab R2010b的混合编程。

为了更加直观的说明如何实现混合编程,笔者写了一个简单的程序作为测试。先在Matlab里面写一个M文件,代码如下:

function b = MyFunc(a)

b = a.*a;

将M文件保存为MyFunc.m,保存在F:/test文件夹中。然后在Matlab主窗口中将当前文件夹改为F:/test:

cd F:/test;

为了能够让VC调用Matlab程序,我们可以采用将Matlab程序包装成动态链接文件DLL的形式,然后让VC调用动态链接文件,因此在Matlab中,我们需要设置一下Matlab的编译库,在Matlab主窗口中键入如下代码:

mbuild –setup

然后出现

Please choose your compiler for buildingstandalone MATLAB applications:

Would you like mbuild to locate installedcompilers [y]/n?

键入y后回车,出现

Select a compiler:

[1] Lcc-win32 C 2.4.1 inD:\PROGRA~1\MATLAB\R2010b\sys\lcc

[2] Microsoft Visual C++ 2008 SP1 inD:\Program Files\Microsoft Visual Studio 9.0


[0] None


Compiler:

由于我们是需要用VC来调用Matlab函数,因此我们选择2,回车,出现

Please verify your choices:


Compiler: Microsoft Visual C++ 2008 SP1

Location: D:\Program Files\Microsoft VisualStudio 9.0


Are these correct [y]/n?

确定,键入y后回车,出现


****************************************************************************

Warning: Applications/components generated using Microsoft VisualStudio

2008 require that the Microsoft Visual Studio 2008 run-time

libraries be available on the computer used for deployment.

To redistribute your applications/components, be sure that the

deployment machine has these run-time libraries.


****************************************************************************

Trying to update options file: C:\Users\张智宇\AppData\Roaming\MathWorks\MATLAB\R2010b\compopts.bat

From template: D:\PROGRA~1\MATLAB\R2010b\bin\win32\mbuildopts\msvc90compp.bat


Done . . .

如果出现以上说明,则证明Matlab编译器设置成功了。接下来是生成M文件的DLL文件。

在Matlab主窗口中键入如下代码

mcc –W cpplib:MyDLL –T link:lib MyFunc.m –C

其中cpplib:后面的是需要生成文件的文件名,是自己取的,link:lib后面的MyFunc.m是转换为DLL的M文件的文件名。 -W/-T/-C是参数,具体含义可以通过mcc –help命令查看,注意参数的大小写。

Matlab编译后会在Test文件夹下生成9个文件,分别是:

mccEcxludedFiles.log

MyDLL.cpp

MyDLL.ctf

MyDLL.dll

MyDLL.exp

MyDLL.exports

MyDLL.h

MyDLL.lib

readme.txt

其中MyDLL.dll,MyDLL.lib,MyDLL.ctf,MyDLL.h是我们需要的文件,至此,Matlab方面就已经设置妥当了。

打开VC2008,新建一个工程,然后将上述四个文件复制到工程目录下。选择“工具-选项-项目和解决方案-VC++目录”,在“显示以下内容目录”里选择“包含文件”将“D:\Program Files\MATLAB\R2010b\extern\include”添加进去,然后选择“库文件”将“D:\Program Files\MATLAB\R2010b\extern\lib\win32\microsoft”添加进去,其中D:\ProgramFiles是Matlab的安装目录,可根据实际情况进行修改。

然后选择“项目-属性-配置属性-链接器-输入”,在右边“附加依赖项”一栏填入“myDLL.lib mclmcrrt.lib”,其中MyDLL.lib就是刚刚用Matlab生成的lib文件。

在编写代码时首先得包含头文件“MyDLL.h”,然后开始编写需要的代码,我为了说明问题编写了一个测试代码如下所示:


{

MyDLLInitialize(); //初始化DLL动态连接文件


double _x[5] = {1,2,3,4,5}; //输入数组

double _y[5]; //输出数组


mxArray* x = mxCreateDoubleMatrix(1, 5,mxREAL); //创建1*5矩阵

memcpy(mxGetPr(x), (void*)_x,sizeof(_x)); //拷贝输入数据


mxArray *input[1] = {x}; //将矩阵x的指针作为输入参数传递进去

mxArray *output[1]; //定义输出参数指针


mlxMyFunc(1,output,1,input); //调用m函数

mxArray *y; //定义输出结果指针

y = output[0]; //将输出参数传递给输出结果

memcpy(_y, mxGetPr(y), sizeof(_y)); //拷贝输出数据


MyDLLTerminate(); //结束DLL库


//显示数组中的数据

CString str;

str.Format("%f %f %f %f%f",_y[0],_y[1],_y[2],_y[3],_y[4]);


MessageBox(str);


}

其中MyDLLInitialize(),mlxMyFunc(),MyDLLTerminate()等函数可以在MyDLL.h中找到函数原型,mlxMyFunc函数原型为:

mlxMyFunc(int nlhs, mxArray *plhs[], intnrhs, mxArray *prhs[])

nlhs代表输出参数个数,plhs[]里面存放的是输出参数的指针,nrhs代表输入参数个数,prhs[]中存放的是输入参数的指针。上例中由于输入输出参数只有一个,因此在plhs[0]中存放的就是M文件中b的指针,prhs[0]中存放的就是M文件中a的指针。

编译运行之后就可以在弹出的消息框中得到所要的结果。将项目文件夹下生成的可执行文件复制出来,将MyDLL.dll文件、MyDLL.ctf文件和.exe文件放在同一目录下便可脱离VC++独立运行。如果需要在其他未装Matlab的机器上运行,则还需要将“D:\Program Files\MATLAB\R2010b\toolbox\compiler\deploy\win32”中的MCRInstaller.exe复制出来,在未安装Matlab的电脑上运行此程序,才可使得刚刚生成的可执行文件顺利运行。

以上程序在Windows 7 家庭普通版 + Visual Studio 2008 专业版 SP1 + Matlab R2010b下编译运行通过。


开放分享:优质有限元技术文章,助你自学成才

相关标签搜索:matlab生成dll MatLab培训 MatLab培训课程 MatLab在线视频教程 MatLab技术学习教程 MatLab软件教程 MatLab资料下载 MatLab代做 MatLab基础知识 Fluent、CFX流体分析 HFSS电磁分析 Ansys培训 Abaqus培训 

编辑
在线报名:
  • 客服在线请直接联系我们的客服,您也可以通过下面的方式进行在线报名,我们会及时给您回复电话,谢谢!
验证码

全国服务热线

1358-032-9919

广州公司:
广州市环市中路306号金鹰大厦3800
电话:13580329919
          135-8032-9919
培训QQ咨询:点击咨询 点击咨询
项目QQ咨询:点击咨询
email:kf@1cae.com