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 changes

Enter 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!\n");
    else
        mexPrintf("大家好!\n");
}
 

>> 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 $ */
 
#include <iostream>
#include <math.h>
#include "mex.h"
 
using namespace std;
 
extern void _main();
 
/****************************/
class MyData {
 
public:
  void display();
  void set_data(double v1, double v2);
  MyData(double v1 = 0, double v2 = 0);
  ~MyData() { }
private:
  double val1, val2;
};
 
MyData::MyData(double v1, double v2)
{
  val1 = v1;
  val2 = v2;
}
 
void MyData::display()
{
#ifdef _WIN32
    mexPrintf("Value1 = %g\n", val1);
    mexPrintf("Value2 = %g\n\n", val2);
#else
  cout << "Value1 = " << val1 << "\n";
  cout << "Value2 = " << val2 << "\n\n";
#endif
}
 
void MyData::set_data(double v1, double v2) { val1 = v1; val2 = v2; }
 
/*********************/
 
static
void mexcpp(
        double num1,
        double num2
        )
{
#ifdef _WIN32
    mexPrintf("\nThe initialized data in object:\n");
#else
  cout << "\nThe initialized data in object:\n";
#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:\n");
#else
  cout << "After setting the object's data to your input:\n";
#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.");
  }
 
  vin1 = (double *) mxGetPr(prhs[0]);
  vin2 = (double *) mxGetPr(prhs[1]);
 
  mexcpp(*vin1, *vin2);
  return;
}
 

>> mex mexcpp.cpp

>> mexcpp(2,4)

The initialized data in object:

Value1 = 0

Value2 = 0


After setting the object's data to your input:

Value1 = 2

Value2 = 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
 
      integer nlhs
      integer nrhs
 
 
      mwpointer plhs(nlhs)
      mwpointer prhs(nrhs)
 
      call mexPrintf('Hello MATLAB World!')
 
      return
      end

>> mex mexHelloWorld.F

>> mexHelloWorld

Hello MATLAB World!>>

>>

 

Ubuntu下GCC、G++和gfortran版本切换

Linux升级GCC 4.8.1清晰简明教程(Ubuntu 12.04 64位版为例) 

在CentOS 6.4中编译安装GCC 4.8.1 + GDB 7.6.1 + Eclipse 在CentOS 6.4中编译安装GCC 4.8.1 + GDB 7.6.1 + Eclipse

Ubuntu下Vim+GCC+GDB安装及使用 

Ubuntu下两个GCC版本切换 

CentOS6.5升级手动安装GCC4.8.2 

GCC 的详细介绍:请点这里
GCC 的下载地址:请点这里

相关内容