一、先用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
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!