Troubleshooting and Limitations Compiling C/C++ MEX Files with MinGW-w64
Do Not Link to Library Files Compiled with Non-MinGW Compilers
If you use the MinGW® compiler to build a MEX file that links to a library compiled with a
non-MinGW compiler, such as Microsoft®
Visual Studio®, the file will not run in MATLAB®. Library (.lib) files generated by different
compilers are not compatible with each other.
You can generate a new library file using the dlltool utility
from MinGW.
MinGW Installation Folder Cannot Contain Space
Do not install MinGW in a location with spaces in the path name. For example, do not use:
C:\Program Files\mingw-64
Instead, use:
C:\mingw-64
MEX Command Does not Choose MinGW
If you only have the MinGW compiler installed on your system, the mex
command automatically chooses MinGW for both C and C++ MEX files. If you have multiple C or C++ compilers,
use mex -setup to choose MinGW for both C and, if required, C++ MEX files.
mex -setup mex -setup cpp
If you only type mex -setup choosing MinGW, when you compile a C++ file, mex might choose a
different compiler.
Manually Configure MinGW for MATLAB
When you install MinGW from the MATLAB Add-Ons menu, MATLAB automatically detects the MinGW compiler.
If necessary, you can manually configure MinGW, if you have Windows® administrative privileges, using the configuremingw
script. To download this script, see the MATLAB Answers article "I already have MinGW on my computer. How do I configure it to work with
MATLAB".
MinGW Behaves Similarly to gcc/g++ on Linux
When modifying compiler flags using the mex command, use the
Linux® compiler flags CFLAGS or
CXXFLAGS instead of the Windows flag COMPFLAGS.
Potential Memory Leak Inside C++ MEX Files on Using MEX Exceptions
Error handling in C++ MEX files compiled with the MinGW-w64 compiler is not
consistent with MATLAB error handling. If a C++ MEX file contains a class, using the
mexErrMsgIdAndTxt function to throw a MEX exception can cause
a memory leak for objects created for the class.
MathWorks recommends that you use the C++ MEX API instead of the C Matrix API. For more information, see Write C++ Functions Callable from MATLAB (MEX Files).
For example, the following C++ MEX function contains class
MyClass.
#include "mex.h"
class MyClass {
public:
MyClass() {
mexPrintf("Constructor called");
}
~MyClass() {
mexPrintf("Destructor called");
}
};
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
MyClass X;
if (nrhs != 0) {
mexErrMsgIdAndTxt("MATLAB:cppfeature:invalidNumInputs",
"No input arguments allowed.");
}
}
The MEX function creates object X from
MyClass, then checks the number of input arguments. If the
MEX function calls mexErrMsgIdAndTxt, the MATLAB error handling does not free memory for object X,
thus creating a memory leak.
Unhandled Explicit Exceptions in C++ MEX Files Unexpectedly Terminate MATLAB
If a function in a C++ MEX file throws an explicit exception which is not caught
inside the MEX file with a catch statement, then the exception
causes MATLAB to terminate instead of propagating the error to the MATLAB command line.
#include "mex.h"
class error {}; // Throw an exception of this class
class MyClass
{
public:
MyClass(){
mexPrintf("Constructor called.");
}
~MyClass(){
mexPrintf("Destructor called.");
}
};
void doErrorChecking(const MyClass& obj)
{
// Do error checking
throw error();
}
void createMyClass()
{
MyClass myobj;
doErrorChecking(myobj);
}
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
createMyClass();
}The MEX function calls createMyClass, which creates an object
of class MyClass and calls function
doErrorChecking. Function doErrorChecking
throws an exception of type error. This exception, however, is
not caught inside the MEX file and causes MATLAB to crash.
This behavior also occurs for classes inheriting from the class
std::exception.
Workaround
Catch the exception in the MEX function:
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
try{
createMyClass();
}
catch(error e){
// Error handling
}
}