ubuntu14.04下用gcc及gfortran编写…

一、先用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/MATLAB/R2012a/bin/mexopts.sh : 

      Template Options file for building gcc MEX-files

   0: Exit with no changes


Enter the number of the compiler (0-1):

1



/opt/MATLAB/R2012a/bin/mexopts.sh is being copied to 

/home/mymotif/.matlab/R2012a/mexopts.sh


四、测试

    (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");

}


在matlab中执行:

>> mex hello1.c

>> hello1(0)

大家好!

>> hello1(1)

hello,world!



mexFunction 输入参数

int  nlhs :输出 参数的 个数

mxArray  *  plhs :输出参数的 mxArray数组

int  nrhs :输入 参数的 个数

mxArray  *  prhs: 输入参数的 mxArray 数组


(2)g++例子:

mexcpp.cpp 

 

#include

#include

#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;


 


  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)


(3)gfortran例子


# include

      subroutine mexFunction ( nlhs, plhs, nrhs, prhs )


c*********************************************************************

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!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值