如果你使用MinGW®编译器来构建一个MEX文件,该文件链接到用非mingw编译器编译的库,例如微软®Visual Studio®,该文件将不会在MATLAB中运行®.库(. lib
不同编译器生成的文件彼此不兼容。
控件可以生成一个新的库文件dlltool
从MinGW效用。
不要在路径名中包含空格的位置安装MinGW。例如,不要使用:
c:\program files\mingw - 64
相反,使用:
C: \ mingw - 64
如果您的系统上只安装了MinGW编译器,则墨西哥人
命令自动为C和c++的MEX文件选择MinGW。如果你有多个C或c++编译器,请使用墨西哥人设置
为C和(如果需要的话)c++ MEX文件选择MinGW。
墨西哥人设置墨西哥人设置cpp
如果你只输入墨西哥人设置
当你编译一个c++文件时,选择MinGW,墨西哥人
可以选择不同的编译器。
当你从MATLAB安装MinGW附加组件菜单,MATLAB自动检测MinGW编译器。
如果有必要,您可以手动配置MinGW,如果您有Windows®管理权限,使用configuremingw
脚本。要下载此脚本,请参阅MATLAB Answers文章“我的电脑上已经有MinGW了。我如何配置它与MATLAB一起工作".
修改编译器标志时使用墨西哥人
命令,使用Linux®编译器标志CFLAGS
或CXXFLAGS
而不是Windows标志COMPFLAGS
.
使用MinGW-w64编译器编译的c++ MEX文件的错误处理与MATLAB错误处理不一致。如果一个c++ MEX文件包含一个类,使用mexErrMsgIdAndTxt
函数抛出MEX异常可能导致为类创建的对象的内存泄漏。
MathWorks建议您使用c++ MEX API而不是C Matrix API。有关更多信息,请参见c++墨西哥人的应用程序.
例如,下面的c++ MEX函数包含类MyClass
.
#include "mex.h" class MyClass {public: MyClass() {mexPrintf("Constructor called");} ~MyClass() {mexPrintf("调用析构函数");}};void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {MyClass X;if (nrhs != 0) {mexrrmsgidandtxt ("MATLAB:cppfeature:invalidNumInputs", "No input arguments allowed.");} }
MEX函数创建对象X
从MyClass
,然后检查输入参数的数量。如果MEX函数调用mexErrMsgIdAndTxt
, MATLAB错误处理不为对象释放内存X
,从而创建内存泄漏。
如果c++ MEX文件中的函数抛出一个显式异常,该异常在使用抓
语句,则异常导致MATLAB终止,而不是将错误传播到MATLAB命令行。
#include "mex.h"类错误{};//抛出这个类的异常class MyClass {public: MyClass(){mexPrintf("Constructor called.");} ~MyClass(){mexPrintf("已调用析构函数");}};void doErrorChecking(const MyClass& obj){//执行错误检查抛出error();} void createyclass () {MyClass myobj;doErrorChecking (myobj);} void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {createMyClass();}
MEX函数调用createMyClass
,它创建一个class对象MyClass
并调用函数doErrorChecking
.函数doErrorChecking
抛出类型为的异常错误
.然而,这个异常在MEX文件中没有被捕获,并导致MATLAB崩溃。
从类继承的类也会发生这种行为std::异常
.
在MEX函数中捕获异常:
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {try{createMyClass();} catch(error e){//错误处理}}