主要内容

故障排除和限制编译C / c++与墨西哥人文件MinGW-w64

不链接库文件和非编译吗MinGW编译器

如果你使用MinGW®编译器构建一个墨西哥人文件链接到一个图书馆与non-MinGW编译器编译,如微软®Visual Studio®,文件不会在MATLAB中运行®。库(. lib)文件所产生的不同的编译器不兼容。

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

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

不要安装MinGW与空间位置的路径名。例如,不要使用:

c:\program files\mingw - 64

相反,使用:

C: \ mingw - 64

墨西哥人命令不会选择MinGW

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

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

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

手动配置MinGWMATLAB

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

如果有必要,您可以手动配置MinGW,如果你有窗户®管理权限,使用configuremingw脚本。下载该脚本,请参阅MATLAB的答案“我已经MinGW在我的电脑。我如何配置使用MATLAB”

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

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

潜在的内存泄漏在c++墨西哥人文件使用墨西哥人例外

错误处理与MinGW-w64 c++墨西哥人文件编译与MATLAB编译器不一致错误处理。如果一个c++墨西哥人文件包含一个类,使用mexErrMsgIdAndTxt函数抛出一个墨西哥人异常可能导致内存泄漏的类创建的对象。

MathWorks建议你使用c++墨西哥人API而不是矩阵C API。有关更多信息,请参见从MATLAB编写c++函数调用(墨西哥人文件)

例如,下面的c++墨西哥人函数包含类MyClass

# include”墨西哥人。h”MyClass类{公众:MyClass () {mexPrintf(“构造函数叫做“);}~ MyClass () {mexPrintf(“析构函数称为”);}};空白mexFunction (int nlhs mxArray * plhs [], int nrhs, const mxArray * prhs []) {MyClass X;如果(nrhs ! = 0) {mexErrMsgIdAndTxt (“MATLAB: cppfeature: invalidNumInputs”,“不允许输入参数。”);}}

墨西哥人函数创建对象XMyClass,然后检查输入参数的数量。如果墨西哥人函数调用mexErrMsgIdAndTxt,MATLAB错误处理不空闲内存对象X,从而创建一个内存泄漏。

未处理的显式异常在c++中墨西哥人文件意外终止MATLAB

如果一个函数在一个c++墨西哥人文件抛出一个显式异常不是墨西哥人内部文件声明,从而实现MATLAB终止与其传播错误MATLAB命令行。

# include”墨西哥人。h”类错误{};/ /这个类的抛出一个异常类MyClass{公众:MyClass () {mexPrintf(“构造函数调用。”);}~ MyClass () {mexPrintf(“析构函数调用。”);}};空白doErrorChecking (const myclass obj){/ /做错误检查抛出错误();}无效createMyClass () {MyClass myobj;doErrorChecking (myobj);}无效mexFunction (int nlhs mxArray * plhs [], int nrhs, const mxArray * prhs []) {createMyClass ();}

墨西哥人的函数调用createMyClass,创建一个类的对象MyClass并调用函数doErrorChecking。函数doErrorChecking抛出一个异常的类型错误。这个异常,然而,不是被墨西哥人内部文件,使MATLAB崩溃。

这种行为也会发生类继承的类std::异常

解决方案

捕获异常的墨西哥人功能:

空白mexFunction (int nlhs mxArray * plhs [], int nrhs, const mxArray * prhs[]){尝试{createMyClass ();}捕捉(误差e){/ /错误处理}}

另请参阅

相关的话题