故障排除和限制编译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++文件时,墨西哥人
可以选择不同的编译器。
手动配置MinGW为MATLAB
当你安装MinGW MATLAB附加组件菜单,MATLAB自动检测MinGW编译器。
如果有必要,您可以手动配置MinGW,如果你有窗户®管理权限,使用configuremingw
脚本。下载该脚本,请参阅MATLAB的答案“我已经MinGW在我的电脑。我如何配置使用MATLAB”。
MinGW行为类似于gcc / g + +Linux
当修改编译器标志使用墨西哥人
命令,使用Linux®编译器标志CFLAGS
或CXXFLAGS
而不是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”,“不允许输入参数。”);}}
墨西哥人函数创建对象X
从MyClass
,然后检查输入参数的数量。如果墨西哥人函数调用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){/ /错误处理}}