首页 / 操作系统 / Linux / Ubuntu 14.04下用GCC及gfortran编写MEX程序(Matlab2012a)
Ubuntu 14.04下用GCC及gfortran编写MEX程序(Matlab2012a)一、先用apt-get安装一个低版本gcc sudo apt-get install gcc-4.4 g++-4.4 gfortran-4.4 matlab2012a可以支持到最高为4.4版本的gcc,而ubuntu14.04默认的gcc版本为4.8二、修改mexopts.sh sudo vi /opt/MATLAB/R2012a/bin/mexopts.sh 将所有的gcc、g++、gfortran出现分别替换成gcc-4.4、g++-4.4、gfortran-4.4 将CFLAGS="-ansi -D_GNU_SOURCE"改为CFLAGS="-std=c99 -D_GNU_SOURCE"以支持//风格注释三、启动matlab执行mex -setup命令>> mex -setup Options files control which compiler to use, the compiler and link command options, and the runtime libraries to link against. Using the "mex -setup" command selects an options file that is placed in /home/mymotif/.matlab/R2012a and used by default for "mex". An options file in the current working directory or specified on the command line overrides the default options file in /home/mymotif/.matlab/R2012a. To override the default options file, use the "mex -f" command (see "mex -help" for more information).The options files available for mex are: 1: /opt/local/MATLAB/R2012a/bin/mexopts.sh : Template Options file for building gcc-4.4 MEX-files 0: Exit with no changesEnter the number of the compiler (0-1):1/opt/local/MATLAB/R2012a/bin/mexopts.sh is being copied to/home/mymotif/.matlab/R2012a/mexopts.sh************************************************************************** Warning: The MATLAB C and Fortran API has changed to support MATLAB variables with more than 2^32-1 elements. In the near future you will be required to update your code to utilize the new API. You can find more information about this at: http://www.mathworks.com/help/techdoc/matlab_external/bsflnue-1.html Building with the -largeArrayDims option enables the new API.**************************************************************************四、测试(1)进入matlab工作目录,并创建源文件hello1.c内容如下:#include "mex.h" void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { int i; i=mxGetScalar(prhs[0]); if(i==1) mexPrintf("hello,world!
"); else mexPrintf("大家好!
"); } >> mex hello1.c>> hello1(0)大家好!>> hello1(1)hello,world!mexFunction 输入参数含义int nlhs :输出 参数的 个数mxArray * plhs :输出参数的 mxArray数组int nrhs :输入 参数的 个数mxArray * prhs: 输入参数的 mxArray 数组(2)g++例子:mexcpp.cpp
/*========================================================== * mexcpp.cpp - example in MATLAB External Interfaces * * Illustrates how to use some C++ language features in a MEX-file. * It makes use of member functions, constructors, destructors, and the * iostream. * * The routine simply defines a class, constructs a simple object, * and displays the initial values of the internal variables. It * then sets the data members of the object based on the input given * to the MEX-file and displays the changed values. * * This file uses the extension .cpp. Other common C++ extensions such * as .C, .cc, and .cxx are also supported. * * The calling syntax is: * * mexcpp( num1, num2 ) * * Limitations: * On Windows, this example uses mexPrintf instead cout. Iostreams * (such as cout) are not supported with MATLAB with all C++ compilers. * * This is a MEX-file for MATLAB. * Copyright 1984-2009 The MathWorks, Inc. * *========================================================*/ /* $Revision: 1.5.4.4 $ */
static void mexcpp( double num1, double num2 ) { #ifdef _WIN32 mexPrintf("
The initialized data in object:
"); #else cout << "
The initialized data in object:
"; #endif MyData *d = new MyData; // Create a MyData object d->display(); // It should be initialized to // zeros d->set_data(num1,num2); // Set data members to incoming // values #ifdef _WIN32 mexPrintf("After setting the object"s data to your input:
"); #else cout << "After setting the object"s data to your input:
"; #endif d->display(); // Make sure the set_data() worked delete(d); flush(cout); return; }
void mexFunction( int nlhs, mxArray *[], int nrhs, const mxArray *prhs[] ) { double *vin1, *vin2;
/* Check for proper number of arguments */
if (nrhs != 2) { mexErrMsgIdAndTxt("MATLAB:mexcpp:nargin", "MEXCPP requires two input arguments."); } else if (nlhs >= 1) { mexErrMsgIdAndTxt("MATLAB:mexcpp:nargout", "MEXCPP requires no output argument."); }
mexcpp(*vin1, *vin2); return; } >> mex mexcpp.cpp>> mexcpp(2,4)The initialized data in object:Value1 = 0Value2 = 0 After setting the object"s data to your input:Value1 = 2Value2 = 4(3)gfortran# include <fintrf.h>
subroutine mexFunction ( nlhs, plhs, nrhs, prhs )
c*********************************************************************72 c cc MEXFUNCTION is a MATLAB/F77 interface for the factorial function. c c Discussion: c c The MATLAB user types c c integer plhs(*), prhs(*) c integer nlhs, nrhs