VS和MatlabR混合编程.docx
《VS和MatlabR混合编程.docx》由会员分享,可在线阅读,更多相关《VS和MatlabR混合编程.docx(12页珍藏版)》请在冰豆网上搜索。
VS和MatlabR混合编程
基于VS2008和Matlab R2010a版本的混合编程的实现
调试通了基于VS2008和MatlabR2010a的混合编程,win7-32位机。
比起一般的指南,本文站在多个开发人员协同开发的需求之上,因此配置要稍微复杂一些,当然也会全面一些
1.Matlab R2010a编译器设置
为了能够让VS调用Matlab程序,我们可以采用将Matlab程序包装成动态链接文件DLL的形式,然后让VS调用动态链接文件,因此在Matlab中,我们需要设置一下Matlab的编译库,在Matlab主窗口中键入如下代码:
mbuild–setup
然后出现
PleasechooseyourcompilerforbuildingstandaloneMATLABapplications:
Wouldyoulikembuildtolocateinstalledcompilers[y]/n?
键入y后回车,出现
Selectacompiler:
[1]Lcc-win32C2.4.1inD:
PROGRA~1MATLABR2010asyslcc
[2]MicrosoftVisualC++2008SP1inD:
ProgramFilesMicrosoftVisualStudio9.0
[0]None
Compiler:
由于我们是需要用VS来调用Matlab函数,因此我们选择2,回车,出现
Pleaseverifyyourchoices:
Compiler:
MicrosoftVisualC++2008SP1
Location:
D:
ProgramFilesMicrosoftVisualStudio9.0
Arethesecorrect[y]/n?
确定,键入y后回车,出现
****************************************************************************
Warning:
Applications/componentsgeneratedusingMicrosoftVisualStudio
2008requirethattheMicrosoftVisualStudio2008run-time
librariesbeavailableonthecomputerusedfordeployment.
Toredistributeyourapplications/components,besurethatthe
deploymentmachinehastheserun-timelibraries.
****************************************************************************
Tryingtoupdateoptionsfile:
C:
UsersAppDataRoamingMathWorksMATLABR2010bcompopts.bat
Fromtemplate:
D:
PROGRA~1MATLABR2010bbinwin32mbuildoptsmsVS90compp.bat
Done...
如果出现以上说明,则证明Matlab编译器设置成功了。
接下来是生成M文件的DLL文件。
2.写my_add.m文件
为了更加直观的说明如何实现混合编程,笔者写了一个简单的程序作为测试。
先在Matlab里面写一个M文件,代码如下:
function[c]=my_add(a,b)
c=a+b;
end
将M文件保存为my_add.m,保存在C:
\Users\Administrator\Desktop\混编\hello_mex文件夹中。
然后在Matlab主窗口中将当前文件夹改为C:
\Users\Administrator\Desktop\混编\hello_mex:
cdC:
\Users\Administrator\Desktop\混编\hello_mex;
3.生成my_add.dll,my_add.lib,my_add.h
在Matlab主窗口中键入如下代码
mcc-Wcpplib:
my_add-Tlink:
libmy_add
其中cpplib:
后面的是需要生成dll文件的文件名,是自己取的,link:
lib后面的my_add.m是转换为DLL的M文件的文件名。
-W/-T/-C是参数,具体含义可以通过mcc–help命令查看,注意参数的大小写。
Matlab编译后会在hello_mex文件夹下生成9个文件,分别是:
其中my_add.dll,my_add.lib,my_add.h是我们需要的文件,至此,Matlab方面就已经设置妥当了。
4.VS2008编译器配置
4.1新建工程
打开VS2008,C:
\Users\Administrator\Desktop\混编\hello_mex下新建一个工程:
目录如下
4.2提取matlabsdk
1.
新建目录C:
\Users\Administrator\Desktop\混编\hello_mex\test1_vs\SDK\matlab_r2010a
2.把matlab的安装目录D:
\ProgramFiles\MATLAB\R2010a\extern下的include和lib文件夹拷贝到C:
\Users\Administrator\Desktop\混编\hello_mex\test1_vs\SDK\matlab_r2010a下
3.新建目录C:
\Users\Administrator\Desktop\混编\hello_mex\test1_vs\SDK\matlab_r2010\bin;把D:
\ProgramFiles\MATLAB\R2010a\bin\win32的所有dll拷贝到C:
\Users\Administrator\Desktop\混编\hello_mex\test1_vs\SDK\matlab_r2010\bin下
4.最终的文件目录如下
其实这些就是vs2008编译需要的dll,h,lib,我们单独提取出来是方便使用(不独立出来也可以,本文只按独立出来来写的),当然还可以精简,但是描述复杂,要精简的sdk可以联系笔者
4.3配置VS2008编译器
4.3.1配置头文件包含
..\SDK\matlab_r2010a\include;..\SDK\matlab_r2010a\include\win32
4.3.2配置附加库目录
..\SDK\matlab_r2010a\lib
5.写test1_vs.cpp
5.1写入matlab自带lib
在源文件test1_vs.cpp开始写入
/*matlab_r2010a库配置*/
#include"..\\SDK\\matlab_r2010a\\include\\mat.h"
#pragmacomment(lib,"..\\SDK\\matlab_r2010a\\lib\\libmat.lib")
#pragmacomment(lib,"..\\SDK\\matlab_r2010a\\lib\\libmx.lib")
#pragmacomment(lib,"..\\SDK\\matlab_r2010a\\lib\\libmex.lib")
#pragmacomment(lib,"..\\SDK\\matlab_r2010a\\lib\\libeng.lib")
#pragmacomment(lib,"..\\SDK\\matlab_r2010a\\lib\\mclmcrrt.lib")
5.2写入my_add.lib
my_add.h和my_add.lib放在C:
\Users\Administrator\Desktop\混编\hello_mex\test1_vs\test1_vs下
把my_add.h添加到项目中
#include"my_add.h"
#pragmacomment(lib,"my_add.lib")
5.3写入cpp和m交互输入输出
intmain(intargc,char*argv[])
{
my_addInitialize();//初始化DLL动态连接文件
double_x1[5]={1,2,3,4,5};//输入数组
double_x2[5]={1,2,3,4,5};//输入数组
double_y[5];//输出数组
mxArray*x1=mxCreateDoubleMatrix(1,5,mxREAL);//创建1*5矩阵
memcpy(mxGetPr(x1),(void*)_x1,sizeof(_x1));//拷贝输入数据
mxArray*x2=mxCreateDoubleMatrix(1,5,mxREAL);//创建1*5矩阵
memcpy(mxGetPr(x2),(void*)_x2,sizeof(_x2));//拷贝输入数据
mxArray*input[2]={x1,x2};//将矩阵x的指针作为输入参数传递进去
mxArray*output[1];//定义输出参数指针
mlxMy_add(1,output,2,input);//调用m函数
mxArray*y;//定义输出结果指针
y=output[0];//将输出参数传递给输出结果
memcpy(_y,mxGetPr(y),sizeof(_y));//拷贝输出数据
my_addTerminate();//结束DLL库//显示数组中的数据
printf("%f%f%f%f%f",_y[0],_y[1],_y[2],_y[3],_y[4]);
return0;
}
其中my_addInitialize(),mlxMy_add(),my_addTerminate()等函数可以在my_add.h中找到函数原型,mlxMy_add函数原型为:
mlxMy_add(intnlhs,mxArray*plhs[],intnrhs,mxArray*prhs[])
nlhs代表输出参数个数,plhs[]里面存放的是输出参数的指针,nrhs代表输入参数个数,prhs[]中存放的是输入参数的指针。
上例中由于输入输出参数只有2个,因此在plhs[0]中存放的就是M文件中a的指针,在plhs[1]中存放的就是M文件中b的指针,prhs[0]中存放的就是M文件中c的指针。
5.4编译生成程序
把my_add.dll拷贝到Release\Debug下,编译运行可得到
6.发布程序:
MCRInstaller.exe脱离matlab2010a
将项目文件夹下生成的可执行文件复制出来,将my_add.dll文件,.exe文件放在同一目录下便可脱离VS++独立运行
如果需要在其他未装Matlab的机器上运行,则还需要将“D:
ProgramFiles\MATLABR2010b\toolbox\compiler\deploy\win32”中的MCRInstaller.exe复制出来,在未安装Matlab的电脑上运行此程序,才可使得刚刚生成的可执行文件顺利运行。
7.常见问题
7.1没有添加环境变量
问题:
解决方法:
添加环境变量C:
\ProgramFiles\MATLAB\MATLABCompilerRuntime\v713\runtime\win32
8.总结
直接利用m文件,简化了开发难度,但是为用户增加了不少麻烦,首先安装162M的matalb运行时环境,当然运行时间也是一个需要考虑的因素;对于开发者,需要掌握混编技术,搭建开发环境,同时熟悉matlab和C++,完成输入输出数据的转换
9.参考