Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Solución de problemas y limitaciones compilar archivos MEX C/C++ con-W64MinGW

No vincular a archivos de biblioteca compilados con no compiladoresMinGW

Si usa el compilador para compilar un archivo MEX que enlaza a una biblioteca compilada con un compilador que no sea MinGW, comoMinGW® Microsoft®Visual Studio®, el archivo no se ejecutará en.MATLAB® Los archivos Library () generados por diferentes compiladores no son compatibles entre sí..lib

Puede generar un nuevo archivo de biblioteca utilizando la utilidad de.dlltoolMinGW

La carpeta de instalación no puede contener espacioMinGW

No instale en una ubicación con espacios en el nombre de la ruta.MinGW Por ejemplo, no utilice:

C:\Program Files\mingw-64

En su lugar, utilice:

C:\mingw-64

Comando MEX no eligeMinGW

Si solo tiene el compilador instalado en el sistema, el comando elige automáticamente para los archivos MEX de C y C++.MinGWmexMinGW Si tiene varios compiladores de C o C++, utilice para elegir ambos C y, si es necesario, C++ archivos MEX.mex -setupMinGW

mex -setup mex -setup cpp

Si solo escribe eligiendo, al compilar un archivo de C++, podría elegir un compilador diferente.mex -setupMinGWmex

Configurar manualmente paraMinGWMATLAB

Cuando se instala desde el menú, detecta automáticamente el compilador.MinGWMATLABAdd-OnsMATLABMinGW

Si es necesario, puede configurar manualmente, si tiene privilegios administrativos, mediante el script.MinGWWindows®configuremingw Para descargar este script, consulte el artículo de respuestas de MATLAB."Ya tengo MinGW en mi computadora. ¿Cómo configuro para trabajar con MATLAB "

Se comporta de forma similar a gcc/g + + enMinGWLinux

Al modificar los indicadores del compilador mediante el comando, use las marcas del compilador o en lugar de la marca.mexLinux®CFLAGSCXXFLAGSWindowsCOMPFLAGS

Fuga de memoria potencial dentro de los archivos MEX de C++ sobre el uso de excepciones MEX

El control de errores en archivos MEX de C++ compilados con el compilador MinGW-W64 no es coherente con el control de errores.MATLAB Si un archivo MEX de C++ contiene una clase, el uso de la función para producir una excepción MEX puede provocar una fuga de memoria para los objetos creados para la clase.mexErrMsgIdAndTxt

Por ejemplo, la siguiente función MEX de C++ contiene clase.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.");      }  } 

La función MEX crea el objeto a partir de, a continuación, comprueba el número de argumentos de entrada.XMyClass Si la función MEX llama, el control de errores no liberar memoria para el objeto, creando así una fuga de memoria.mexErrMsgIdAndTxtMATLABX

Las excepciones explícitas no controladas en archivos MEX de C++ terminan inesperadamenteMATLAB

Si una función en un archivo MEX de C++ produce una excepción explícita que no se detecta dentro del archivo MEX con una instrucción, a continuación, la excepción hace que finalice en lugar de propagar el error a la línea de comandos.catchMATLABMATLAB

#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(); }

Las llamadas de función MEX, que crea un objeto de clase y llama a la función.createMyClassMyClassdoErrorChecking Function produce una excepción de tipo.doErrorCheckingerror Esta excepción, sin embargo, no se detecta dentro del archivo MEX y hace que se bloquee.MATLAB

Este comportamiento también se produce para las clases que heredan de la clase.std::exception

Solución

Catch la excepción en la función MEX:

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {     try{         createMyClass();     }     catch(error e){         // Error handling     } }

Consulte también

Temas relacionados