matlab中mcc和mex等编译命令_第1页
matlab中mcc和mex等编译命令_第2页
matlab中mcc和mex等编译命令_第3页
matlab中mcc和mex等编译命令_第4页
matlab中mcc和mex等编译命令_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

1、Matlab中mcc, mbuild和mex命令详解MATLAB编译及接口Matlab的 HYPERLINK /leixiaohua1020/article/details/38318517 l t0 一 mcc命令 HYPERLINK /leixiaohua1020/article/details/38318517 l t1 二 mex命令 HYPERLINK /leixiaohua1020/article/details/38318517 l t2 三 mbuild命令mcc命令将m文件转换成C/C+文件和相应的MEX包裹文件(需要Matlab编译器)和exe文件,并在特定条件下可以自动调

2、用mbuild或者mex。Mex命令将入口函数为mexfunction()的C/C+文件编译成MEX(DLL)文件(需要C/C+编译器)。Mbuild命令将入口函数为main()的C/C+文件生成可独立运行的C应用程序(需要C/C+编译器)。对于64位的Windows平台,MATLAB没有现成的C编译器。需要免费下载Microsoft Windows SDK编译器。Microsoft Windows SDK for Windows 7 and .NET Framework 4下载地址:(需要联网安装) HYPERLINK /en-us/download/details.aspx?id=8279

3、 /en-us/download/details.aspx?id=8279安装前一定要卸载Microsoft Visual C+ 2010 x86 Redistributable - 10.0.30319以上版本的C+运行库,装完SDK7.1后需要安装VC-Compiler-KB2519277补丁: HYPERLINK /zh-cn/download/details.aspx?id=4422 /zh-cn/download/details.aspx?id=4422在使用mcc, mbuild和mex命令之前,首先要配置MATLAB使用Windows SDK进行C/C+语言编译,配置命令如下:m

4、ex -setupmbuild -setup配置命令运行结果: mex -setupMEX 配置为使用 Microsoft Visual C+ 2012 (C) 以进行 C 语言编译。警告: MATLAB C 和 Fortran API 已更改,现可支持包含 232-1 个以上元素的 MATLAB 变量。不久以后,您需要更新代码以利用新的 API。您可以在以下网址找到相关详细信息:/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html。要选择不同的 C 编译器,请从以下选项中选择一种命令:Microsoft

5、 Visual C+ 2012 (C) mex -setup:C:Program FilesMATLABR2015bbinwin64mexoptsmsvc2012.xml CMicrosoft Windows SDK 7.1 (C) mex -setup:C:Program FilesMATLABR2015bbinwin64mexoptswinsdk-7.1_c.xml C要选择不同的语言,请从以下选项中选择一种命令: mex -setup C+ mex -setup FORTRAN mbuild -setupMBUILD 配置为使用 Microsoft Visual C+ 2012 (C)

6、以进行 C 语言编译。要选择不同的 C 编译器,请从以下选项中选择一种命令:Microsoft Visual C+ 2012 (C) mex -setup:C:Program FilesMATLABR2015bbinwin64mexoptsmsvc2012.xml C -client MBUILDMicrosoft Windows SDK 7.1 (C) mex -setup:C:Program FilesMATLABR2015bbinwin64mexoptswinsdk-7.1_c.xml C -client MBUILD要选择不同的语言,请从以下选项中选择一种命令:mex -setup C

7、+ -client MBUILD mex -setup FORTRAN -client MBUILD注释:API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。mex和mbuild编译的C/C+文件的差别:使用mbuild命令编译的C/C+源文件中,必须包含main()函数,它能独立于Matlab运行。而mex命令编译的C/C+源文件中不含main()函数,它是以mexfunction()函数作为入口的,编译后生成的是me

8、x文件,被Matlab调用。一、mcc命令配置MATLAB的C/C+语言编译器后,可以使用如下命令将.m程序编译成exe文件或C/C+语言源程序。mcc -m mfilename %编译生成exe文件,允许弹出MS-DOS命令窗口mcc -e mfilename %编译生成静默运行的exe文件,不显示运行结果mcc -l mfilename %使用 Microsoft Windows SDK 7.1 (C) 编译。 mcc -W cpplib:component_name -T link:lib mfilename %使用 Microsoft Windows SDK 7.1 (C+) 编译。这

9、里主要介绍如何在matlab环境下,通过mcc命令,把m文件转换为exe文件。无论是程序文件还是函数文件,都可以通过mcc命令将其转换为exe文件。程序文件转换成的exe文件可以在直接运行,函数文件转换的exe文件则需要通过commandline输入参数,但输入的参数为char型,因此在程序里必须予以考虑。举例如下:1. 建立一个m文件建立的m文件可以是程序文件,也可以是函数文件。例如,在matlab中建立一个m文件,命名为testadd.m,内容如下:function result = testadd(v1, v2)% 函数程序使用mcc生成独立的可执行程序举例if (ischar(v1)

10、v1 = str2num(v1);endif (ischar(v2) v2 = str2num(v2);endresult = v1 + v2;disp(输入的两个参数之和为:);disp(result);reply = input(Press any key to leave., s);fprintf(Thanks for using!n);2. 生成exe文件在command window输入“mcc -m testadd.m”,等待生成testadd.exe文件。3. 运行exe文件对于程序文件生成的exe文件,双击运行即可。对于函数文件生成的exe文件,通常需要在命令行对参数进行赋值。

11、由于前面生成的testadd.exe程序是由Matlab的函数文件编译而成,故需要在运行时给输入参数赋值,赋值方法是将参数列表附在程序名的后面用空格分开。1). 通过批处理文件运行在该程序所在的文件夹中建立一个批处理文件testadd.cmd(用记事本或其他文本编辑器建立),例如输入testadd.exe 10 15并保存,双击运行testadd.cmd。2). 通过windows控制台运行打开开始运行窗口,输入cmd进入dos窗口,然后进入包含testadd.exe的文件夹,例如输入“testadd.exe 16 29”运行该程序。值得注意的是,testadd.m函数有两个参数,而testa

12、dd.exe的输入参数只能通过commandline参数输入,但输入的参数为char型,所以程序里必须对此考虑。对于一个不需要运行中输入参数的Matlab程序,编译后使用方便快捷,但要现实计算结果的话,会弹出黑色的MS-DOS命令窗口。请看如下程序:%请将如下程序存入testexe.mclear;t1=1 11 21 31 41 51 61 71;t2=1.3 4.4 8.3 19.6 28.6 30.7 32.9 33.4;disp(t1=)disp(t1)disp(t2=)disp(t2)plot(t1,t2,*r-)t3=factor(5)t4=magic(5)t5=谢谢同学们能够认真学

13、习数学软件!pause(5)在Matlab的命令窗口输入命令mcc -m testexe,得到可在windows下独立运行的程序testexe.exe,所绘图形与在Matlab环境下的效果一样。二、mex命令用户可以在Matlab中按简单的M文件语法规则设计出来完成特定计算的算法。然后用Matlab编译器调用mex命令创建C共享库函数(DLL)或C+静态函数库,最后将它们整合到C/C+应用程序中,编译完这些C/C+应用程序,就可以用这些算法来实现特定的计算功能。当然这过程中也隐藏了算法和加快了代码的执行效率。由于mex文件执行效率高,故如果有文件重名的话,Matlab将优先调用mex文件。Ma

14、tlab的mex命令只能编译不含main()的C/C+文件,生成的mex函数供Matlab调用。mex mfilename %编译不含main()的C/C+文件生成mex函数mbuild mfilename %编译含有main()的C/C+文件生成mex函数通过把耗时长的函数用c语言实现,并编译成mex函数可以加快执行速度。Matlab本身是不带c语言编译器的,所以要求你的机器上安装VC,Dev-C+或WatcomC等编译器之一。如果你在安装Matlab时已经设置过编译器,那么现在你应该就可以使用mex命令来编译c语言的程序了。如果当时没有设置,就在Matlab里键入mex-setup,并根据

15、提示一步步设置就可以了。需要注意的是,较低版本的Matlab在设置编译器路径时,只能使用路径名称的8字符形式。比如我用的VC装在路径C:PROGRAMFILESDEVSTUDIO下,那在设置路径时就要写成:“C:PROGRA1”这样设置完之后,mex就可以执行了。为了测试你的路径设置正确与否,把下面的程序存为hello.c。/*hello.c*/#include mex.h void mexFunction(int nlhs, mxArray *plhs, int nrhs, const mxArray *prhs) mexPrintf(hello,world!n); 假设你把hello.c放

16、在了C:test下,在Matlab里用CDC:test将当前目录改为C:test。(注意,仅将C:test加入搜索路径是没有用的)在命令窗口执行:mexhello.c如果一切顺利,编译应该在出现编译器提示信息后正常退出。如果你已将C:test加入了搜索路径,现在键入hello,程序会在屏幕上打出一行:hello,world!分析hello.c,可以看到程序的结构是十分简单的,整个程序由一个接口子过程mexFunction构成:voidmexFunction(intnlhs,mxArray*plhs,intnrhs,constmxArray*prhs)Matlab的mex函数有一定的接口规范,期

17、中nlhs:输出参数数目plhs:指向输出参数的指针nrhs:输入参数数目prhs:指向输入参数的指针例如,使用 a,b=test(c,d,e) 调用mex函数test时,传给test的这5个参数分别是plhs2,prhs3,其中:prhs0=cprhs1=dprhs2=e当函数返回时,将会把你放在plhs0,plhs1里的地址赋给a和b,达到返回数据的目的。也许你已经注意到,prhsi和plhsi都是指向类型mxArray类型数据的指针。这个类型是在mex.h中定义的,事实上,在Matlab里大多数数据都是以这种类型存在。当然还有其他的数据类型,可以参考Apiguide.pdf里的介绍。为了

18、让大家能更直观地了解参数传递的过程,我们把hello.c改写一下,使它能根据输入参数的变化给出不同的屏幕输出:/hello1.c#includemex.hvoidmexFunction(intnlhs,mxArray*plhs,intnrhs,constmxArray*prhs)inti;i=mxGetScalar(prhs0);if(i=1)mexPrintf(hello,world!n);elsemexPrintf(大家好!n);将这个程序编译通过后,执行hello(1),屏幕上会打出:hello,world!而hello(0)将会得到:大家好!现在,程序hello已经可以根据输入参数来给

19、出相应的屏幕输出。在这个程序里,除了用到了屏幕输出函数mexPrintf(用法跟c里的printf函数几乎完全一样)外,还用到了一个函数:mxGetScalar,调用方式如下:i=mxGetScalar(prhs0);Scalar就是标量的意思。在Matlab里数据都是以数组的形式存在的,mxGetScalar的作用就是把通过prhs0传递进来的mxArray类型的指针指向的数据(标量)赋给C程序里的变量。这个变量本来应该是double类型的,通过强制类型转换赋给了整形变量i。既然有标量,显然还应该有矢量,否则矩阵就没法传了。看下面的程序:/hello2.c#includemex.hvoidm

20、exFunction(intnlhs,mxArray*plhs,intnrhs,constmxArray*prhs)int*i;i=mxGetPr(prhs0);if(i0=1)mexPrintf(hello,world!n);elsemexPrintf(大家好!n);这样,就通过mxGetPr函数从指向mxArray类型数据的prhs0获得了指向double类型的指针。但是,还有个问题,如果输入的不是单个的数据,而是向量或矩阵,那该怎么处理呢?通过mxGetPr只能得到指向这个矩阵的指针,如果我们不知道这个矩阵的确切大小,就没法对它进行计算。为了解决这个问题,Matlab提供了两个函数mxG

21、etM和mxGetN来获得传进来参数的行数和列数。下面例程的功能很简单,就是获得输入的矩阵,把它在屏幕上显示出来:/show.c 1.0 #include mex.h void mexFunction(int nlhs, mxArray *plhs, int nrhs, const mxArray *prhs) double *data; int M,N; int i,j; data=mxGetPr(prhs0); /获得指向矩阵的指针 M=mxGetM(prhs0); /获得矩阵的行数 N=mxGetN(prhs0); /获得矩阵的列数 for(i=0;iM;i+) for(j=0;jN;j

22、+) mexPrintf(%4.3f ,dataj*M+i); mexPrintf(n); 编译完成后,用下面的命令测试一下:a=1:10;b=a;a+1;show(a)show(b)需要注意的是,在Matlab里,矩阵第一行是从1开始的,而在C语言中,第一行的序数为零,Matlab里的矩阵元素b(i,j)在传递到C中的一维数组data后对应于dataj*M+i。输入数据是在函数调用之前已经在Matlab里申请了内存的,由于mex函数与Matlab共用同一个地址空间,因而在prhs里传递指针就可以达到参数传递的目的。但是,输出参数却需要在mex函数内申请到内存空间,才能将指针放在plhs中传递

23、出去。由于返回指针类型必须是mxArray,所以Matlab专门提供了一个函数:mxCreateDoubleMatrix来实现内存的申请,函数原型如下:mxArray*mxCreateDoubleMatrix(intm,intn,mxComplexityComplexFlag)m:待申请矩阵的行数n:待申请矩阵的列数为矩阵申请内存后,得到的是mxArray类型的指针,就可以放在plhs里传递回去了。但是对这个新矩阵的处理,却要在函数内完成,这时就需要用到前面介绍的mxGetPr。使用mxGetPr获得指向这个矩阵中数据区的指针(double类型)后,就可以对这个矩阵进行各种操作和运算了。下面的

24、程序是在上面的show.c的基础上稍作改变得到的,功能是将输入数据加10后输出/reverse.c 1.0#include mex.hvoid mexFunction(int nlhs,mxArray *plhs,int nrhs,const mxArray *prhs) double *inData; double *outData; int M,N; int i,j; inData=mxGetPr(prhs0); M=mxGetM(prhs0); N=mxGetN(prhs0); plhs0=mxCreateDoubleMatrix(M,N,mxREAL); outData=mxGetPr

25、(plhs0); for(i=0;iM;i+) for(j=0;jN;j+) outDataj*M+i=inDataj*M+i+10;当然,Matlab里使用到的并不是只有double类型这一种矩阵,还有字符串类型、稀疏矩阵、结构类型矩阵等等,并提供了相应的处理函数。本文用到编制mex程序中最经常遇到的一些函数,其余的详细情况清参考Apiref.pdf。通过前面两部分的介绍,大家对参数的输入和输出方法应该有了基本的了解。具备了这些知识,就能够满足一般的编程需要了。但这些程序还有些小的缺陷,以前面介绍的reverse.c由于前面的例程中没有对输入、输出参数的数目及类型进行检查,导致程序的容错性很差,以下程序则容错性较好/reverse1.c 1.0#include mex.hvoid mexFunction(int nlhs,mxArray *plhs,int nrhs,const mxArray *prhs) double *inData; double *outData; int M,N; int i,j; /异常处理 /异常处理 if(nrhs!=1) mexErrMsgTxt(USAGE: b=reverse(a)/n); if(!mxIsDouble(prhs0) mexEr

温馨提示

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

评论

0/150

提交评论