vs2010与Matlab R2012b 混合编程_第1页
vs2010与Matlab R2012b 混合编程_第2页
vs2010与Matlab R2012b 混合编程_第3页
vs2010与Matlab R2012b 混合编程_第4页
vs2010与Matlab R2012b 混合编程_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 vs2010和Matlab R2012b 混合编程2013-05-24 22:40 10114人阅读 评论(4) 收藏 举报 分类: C+(2) 版权声明:本文为博主原创文章,未经博主允许不得转载。思路:为了实现matlab与C+混合编程,采用由m文件构造动态链接库然后在visual studio中调用的方法。本人系统:Windows 7旗舰版(32位),VS2010旗舰版,Matlab R2012b    只有R2010b或以上版本才识别VS2010编辑器

2、60;1. matlab中dll创建         1.1    m文件编写          function yt = myfitline( x,y,m,xrange,t )         %xy为坐标向量,m为多项式阶数,xrange为显示图上面的坐标范围,t为要求的坐标横轴位置 

3、;        %   Detailed explanation goes here         p=polyfit(x,y,m);%计算各阶系数p1xm+p2x(m-1)+.+ pmx+ p(m+1)         yy=polyval(p,xrange);%计算一个区域内的函数值用于画图  

4、60;      yt=polyval(p,t);   %  计算指定x下的函数对应的y值         plot(x,y,'r*',xrange,yy,'b')         end        1.2   设置编译器&

5、#160;                    >> mex -setup   选择VS2010                     >> mbuild -se

6、tup  选择VS2010                     >> mcc -W cpplib:Myfitline -T link:lib myfitline     (这就创建好了)           

7、60;  其中,mcc是Matlab提供的编译命令,对于这一点,Matlab的帮助说明如下:               -W lib:string link:lib其中-W是控制编译之后的封装格式,cpplib,是指编译成C+的lib,cpplib冒号后面是指编译的库的名字,-T表示目标,       link:lib表示要连接到一个库文件的目标

8、,目标的名字是后面的myfitline,即你写的m函数的名字。              运行完之后,你的目录下面,将会出现以下一些文件:              Myfitline.cpp            &#

9、160; Myfitline.exp              Myfitline.dll              Myfitline.exports              Myfitline.h

10、0;             Myfitline.lib              mccExcludedFiles.log              readme.txt   &

11、#160;          具体每一个文件的意思,请查帮助,这里只说其中很有用的几个:              Myfitline.dll是编译好的动态库,myfitline这个函数封装在里面,Myfitline.h是对应的头文件,在C里面调用这个函数的时候,需要include这个头文件,      &#

12、160;在这个头文件的最后,你可以看到下面的内容:              extern LIB_Myfitline_CPP_API void MW_CALL_CONV myfitline(int nargout, mwArray& yt, const mwArray& x,              const mwA

13、rray& y, const mwArray& m, const mwArray& xrange, const mwArray& t);                           这就是myfitline的C函数的声明。nargout表示输出变量的个数,其他就是对应了m函数的几个变量。 

14、             注意,变量的类型是mwArray,这是Matlab提供的一个特殊的变量类型(在7.0的版本,编译之后,变量类型是mxArray)。mwArray是一个类,具体可以查帮助。 2.系统环境配置               Computer - > Properties&#

15、160;-> Advanced system settings -> Environment Variables -> User Variables -> path, 添加(MATLAB下为MATLAB 2012软件安装目录)              .MATLABexternlibwin32microsoft; 

16、;             .MATLABbinwin32              Computer - > Properties -> Advanced system settings -> Environment Variab

17、les -> System Variables -> path, 添加              .MATLABruntimewin32;              .MATLABbin;      

18、0;       .MATLABexternlibwin32microsoft;              .MATLABbinwin323.vs2010环境配置             Property Pages -> VC+ D

19、irectories -> Include Directories, 添加(安装目录下)            .MATLABexterninclude             Property Pages -> VC+ Directories -> 

20、Library Directories, 添加            .MATLABexternlibwin32microsoft            Property Pages -> C/C+ -> General -> Additional Includ

21、e Directories, 添加            .MATLABexterninclude            Property Pages -> Linker -> General -> Additional Library Di

22、rectories, 添加            .MATLABexternlibwin32microsoft           Property Pages -> Linker -> Input -> Additional Dependencies, 添加&

23、#160;                         libeng.lib                       &#

24、160;  libmat.lib                          libmex.lib                   

25、0;      libmx.lib                          mclmcrrt.lib               

26、           mclmcr.lib                          Myfitline.lib    4.vs2010下完成程序     

27、60;         把刚才生成的*.h *.dll *.lib文件复制到刚刚新建的工程的文件夹下,并且用添加现有项添加的工程中。(此处的*代表你的m文件名称)               调用函数 myfitline的文件前要         &

28、#160;                  #include "mclmcr.h"                           

29、#include "matrix.h"                            #include "mclcppclass.h"            &#

30、160;               #include "Myfitline.h”              具体程序如下:              void CNewFeatureofS

31、tormView:Onposition()                             / TODO: 在此添加命令处理程序代码                

32、0;if( !MyfitlineInitialize()                                      MessageBox(_T("初始化失败");   

33、60;                               / 为变量分配内存空间,可以查帮助mwArray                &

34、#160; mwArray mwX(5, 1, mxDOUBLE_CLASS); / 5,1表示矩阵的大小(所有maltab只有一种变量,就是矩阵,                  mwArray mwY(5, 1, mxDOUBLE_CLASS);/为了和Cpp变量接轨,设置成1*5的矩阵,mxDOUBLE_CLASS表示变量的精度)      

35、0;           mwArray mwM(1, 1, mxDOUBLE_CLASS);                  mwArray mwXR(50,1, mxDOUBLE_CLASS);           

36、;       mwArray mwYT(1,1, mxDOUBLE_CLASS);                  mwArray mwT(1,1, mxDOUBLE_CLASS);               &#

37、160;  int x5=432,435,438,441,443;    /样本点坐标                  int y5=136,138,140,145,147;    /              

38、60;   int xr50,m=3,t=446;           /参数设置                  for (int i=400;i<450;i+)          

39、0;                             xri-400=i;                    

40、0;               mwX.SetData(x, 5);      /调用类里面的SetData函数给类赋值                  mwY.SetData(y, 5);    

41、;              mwM.SetData(&m, 1);                  mwXR.SetData(xr, 50);            &

42、#160;     mwT.SetData(&t, 1);                  myfitline(1,mwYT,mwX,mwY,mwM,mwXR,mwT);                

43、0; double c = mwYT.Get(1, 1); /调用类里面的Get函数获取取函数返回值                  CString strNumber;                  strNumber.Format(_T("

44、%lf"),c);                  MessageBox(strNumber, _T("坐标");                  / 后面是一些终止调用的程序    &

45、#160;             MyfitlineTerminate();                  / terminate MCR              

46、;   mclTerminateApplication();             vs2010下调用matlab2012b调试方法标签: matlabvs2010配置管理64位error LNK20192013-11-01 16:53 4435人阅读 评论(2) 收藏 举报 分类: matlab(3)  vs2010版权声明:本文为博主原创文章,未经博主允许不得转

47、载。配置环境:vs2010+matlab2012b+win7 64位说明:以安装路径“E:Program FilesMATLABR2012b”为例MATLAB外部支持文件夹:E:Program FilesMATLABR2012bexternmatlab自带的c例程:E:Program FilesMATLABR2012bexternexampleseng_matengine.h的位置:E:Program FilesMATLABR2012bexterninclude各种lib的位置:E:Program FilesMATLABR2012bexternlibwin64microsoft在matlab帮

48、助中输入“C language”即可找到有关MATLAB Engine的一个页面。从这个页面开始,学习各种关键词,就能够找到一切你需要的资料。使用MATLAB Engine一般用两套函数就可以了。1.engXXXX,关于Engine本身的操作,包括打开/关闭,设置/取得变量,执行语句等等。2.mxXXXX,关于数据类型mxArray的操作,与MATLAB交互的左右类型全部为mxArray。搭建过程:1.先在VC6的tools->options->directories里添加相关目录include files:E:Program FilesMATLABR2012bexternincl

49、udeE:Program FilesMATLABR2012bexternincludewin64library files:E:Program FilesMATLABR2012bexternlibwin64microsoft2 点击LInker input 将libmx.lib;libmex.lib;libeng.lib;加入到Additional Dependencies              或者用#pragma comment (lib, "libeng.lib")    &

50、#160;                     #pragma comment (lib, "libmx.lib")                           #pragma comment (lib, "libmex.lib") 语句3 环境变量加上E:Program FilesMATLABR2012b

51、binwin64 否则编译成功运行时会显示缺少 dll4包含头文件 engine.h5这就可以去调用engine里的一些引擎函数了做好这些后,如果我们环境一样,下面的代码应该能够编通并且正常执行,其中包含了常用的一些函数,一般来说使用Engine的时候也就用这些了。出现问题解决方法:1 编译出现:1>test.obj : error LNK2019: 无法解析的外部符号 _engClose,该符号在函数 _main 中被引用1>test.obj : error LNK2019: 无法解析的外部符号 _engSetVisible,该符号在函数 _main 中被引用1>test.

52、obj : error LNK2019: 无法解析的外部符号 _mxDestroyArray,该符号在函数 _main 中被引用1>test.obj : error LNK2019: 无法解析的外部符号 _mxGetData,该符号在函数 _main 中被引用1>test.obj : error LNK2019: 无法解析的外部符号 _mxGetDimensions_730,该符号在函数 _main 中被引用1>test.obj : error LNK2019: 无法解析的外部符号 _mxGetNumberOfDimensions_730,该符号在函数 _main 中被引用1

53、>test.obj : error LNK2019: 无法解析的外部符号 _engGetVariable,该符号在函数 _main 中被引用1>test.obj : error LNK2019: 无法解析的外部符号 _engEvalString,该符号在函数 _main 中被引用1>test.obj : error LNK2019: 无法解析的外部符号 _engPutVariable,该符号在函数 _main 中被引用1>test.obj : error LNK2019: 无法解析的外部符号 _mxGetPr,该符号在函数 _main 中被引用1>test.obj

54、 : error LNK2019: 无法解析的外部符号 _mxCreateDoubleMatrix_730,该符号在函数 _main 中被引用1>test.obj : error LNK2019: 无法解析的外部符号 _engOpen,该符号在函数 _main 中被引用1>D:VSProjectsmatlabtestmatlabtestDebugmatlabtest.exe : fatal error LNK1120: 12 个无法解析的外部命令这个问题如果你按照上述配置好的话,这就很有可能出在兼容问题上。因为2012b只提供64位版本,所有需要将vs工程变为64位。点击win32

55、旁的下拉列表,选择配置管理器。在活动解决方案平台这里选择x64即可。重新编译一切ok。2 如果vs工程中还包含其他库是32位的,那么只能装matlab7 ,他只支持32位。而且matlab6.x版本又不支持vs2010.装好以后,需要配置兼容性。然后点击其桌面的快捷方式,修改其兼容性,我的系统是win7,改成了兼容vista,保存修改,点击成功运行。uniquews· 博客园· 首页· 新随笔· 联系· 订阅· 管理随笔- 51  文章- 0  评论- 7 VS2010与Matlab2010b混合编程VS

56、2010与Matlab2010b混合编程      套用今天的签名“最新的VS+最新的MATLAB+最新的WINDOWS=无尽的烦恼 ”,用了一天的时间去配置相关的环境,确实很囧。好在现在问题解决了,特发布过程如下,希望能给有需要的朋友带来帮助。 注:因为程序也是刚调通,所以有些原因还没有仔细分析,如果不对,敬请指教。1.<MATLAB>表示MATLAB按照目录2. 配置过程中的错误,请见:附录3.文中包含"只针对64位WINDOWS"字眼设置的,在WIN32(X86)环境无需设置4.本文配置

57、中可能包含多余的一些配置,不过现在的目的是运行成功哈至于精简部分,待我和大家使用时慢慢研究。  /*环境:1.VS20102.MATLAB 2010b3.WINDOW 7 (X64)*/  1.Matlab环境设置       要建立独立运行的C应用程序,系统中需要安装Matlab、Matlab编译器、C/C+编译器以及Matlab C/C+数学库函数和图形库函数。Matlab编译器使用mbuild命令可以直接将C/C+源代码编译为独立运行程序,在这些源代码中可以使用Matlab提供的

58、接口来调用Matlab数学库函数。       虽然生成的可执行程序可以脱离Matlab环境运行,但是它需要Matlab C/C+数学库文件或者图形库文件的支持才能运行。但如果C/C+源代码完全是按传统C/C+源代码语法规则编写,没有包含Matlab数学库和图形库的调用,则不仅可以独立与Matlab环境,也不需要那两个库函数的支持。      在 Matlab 的Command Window 下输入命令       

59、mbuild setup      操作过程如下图:         然后输入命令    mex setup    以类似的方法配置编译器。Matlab 的配置完成。 2.VS环境设置(1)设置Include 和Library 目录    项目右键->属性->VC+目录->包含目录:添加    <MATL

60、AB>R2010bexternincludewin64    <MATLAB>R2010bexterninclude    项目右键->属性->VC+目录->库目录:添加    <MATLAB>R2010bexternlibwin32microsoft    <MATLAB>R2010bexternlibwin64microsoft    截图(部分):    (2)设置工程目录    项目右键->属性->C/C+->常规->附件包含目录:添加    <MATLAB>R2010bexternincludewin64    <MATLAB>R2010bexterninclude  

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论