主要内容

故障排除和限制编译C/ c++文件MinGW-w64

不链接库文件编译与非MinGW编译器

如果你使用MinGW®编译器来构建一个MEX文件,该文件链接到用非mingw编译器编译的库,例如微软®Visual Studio®,该文件将不会在MATLAB中运行®.库(. lib不同编译器生成的文件彼此不兼容。

控件可以生成一个新的库文件dlltool从MinGW效用。

MinGW安装文件夹不能包含空间

不要在路径名中包含空格的位置安装MinGW。例如,不要使用:

c:\program files\mingw - 64

相反,使用:

C: \ mingw - 64

MEX命令不选择MinGW

如果您的系统上只安装了MinGW编译器,则墨西哥人命令自动为C和c++的MEX文件选择MinGW。如果你有多个C或c++编译器,请使用墨西哥人设置为C和(如果需要的话)c++ MEX文件选择MinGW。

墨西哥人设置墨西哥人设置cpp

如果你只输入墨西哥人设置当你编译一个c++文件时,选择MinGW,墨西哥人可以选择不同的编译器。

手动配置MinGWMATLAB

当你从MATLAB安装MinGW附加组件菜单,MATLAB自动检测MinGW编译器。

如果有必要,您可以手动配置MinGW,如果您有Windows®管理权限,使用configuremingw脚本。要下载此脚本,请参阅MATLAB Answers文章“我的电脑上已经有MinGW了。我如何配置它与MATLAB一起工作"

MinGW类似于gcc/g++的行为Linux

修改编译器标志时使用墨西哥人命令,使用Linux®编译器标志CFLAGSCXXFLAGS而不是Windows标志COMPFLAGS

关于使用MEX异常的c++ MEX文件中的潜在内存泄漏

使用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函数创建对象XMyClass,然后检查输入参数的数量。如果MEX函数调用mexErrMsgIdAndTxt, MATLAB错误处理不为对象释放内存X,从而创建内存泄漏。

在c++ MEX文件中未处理的显式异常意外终止MATLAB

如果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){//错误处理}}

另请参阅

相关的话题