matlab生成dll

来源:互联网 发布:宁波软件产业园c座 编辑:程序博客网 时间:2024/05/21 08:39
实验室的一个项目需要调用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下编译运行通过。

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 剩米饭变干硬了怎么办 吃剩的米饭变硬怎么办 误食发热包的水怎么办 玻璃饭盒加热后盖子打不开怎么办 玻璃饭盒盖子被吸住了怎么办 微波炉加热饭盒盖子打不开怎么办 铁饭盒盖子打不开了怎么办 塑料玻璃饭盒打不开了怎么办 方便火锅没有发热包怎么办 加热包的水溢出怎么办 军用黄脸盆坏了怎么办 白瓷洗手盆发黄怎么办 挎包没有拉链东西容易掉怎么办 斜挎包肩带长了怎么办 3个月宝宝不吃奶怎么办 米饭扔厕所堵了怎么办 门过梁搭接不够怎么办 华为g7开不了机怎么办 警务通手机丢了怎么办 手机被伪基站覆盖怎么办 听了高频率声音怎么办 qq音乐签到没了怎么办 手机qq音乐不能播放怎么办 台式电脑放歌没有声音怎么办 微信图片上传大愎怎么办 行车记录仪内存卡丢了怎么办 投资项目失败lp的钱怎么办 无线网无ip分配怎么办 为什么电脑的暴风影音打不开怎么办 电枪充电板进水怎么办 捡到一颗子弹该怎么办 防弹衣只保护身体那手臂怎么办? 被子被宝宝尿湿怎么办 眼睛被子弹打了怎么办 gta5买了2套衣服怎么办 gta5车被摧毁了怎么办 gta5车被损坏了怎么办 头盔玻璃磨花了怎么办 浇花喷水壶坏了怎么办 电力专用光缆撞了怎么办 国防电缆挖断了怎么办