Если вы будете использовать компилятор MinGW®, чтобы создать файл MEX, который соединяется с библиотекой, скомпилированной с non-MinGW компилятором, таким как Microsoft® Visual Studio®, файл не запустится в MATLAB®. Файлы библиотеки (.lib), сгенерированные различными компиляторами, не совместимы друг с другом.
Можно сгенерировать новый файл библиотеки с помощью утилиты dlltool от MinGW.
Не устанавливайте MinGW в месте с пробелами в пути. Например, не используйте:
C:\Program Files\mingw-64
Вместо этого используйте:
C:\mingw-64
Если вам только установили компилятор MinGW в вашей системе, команда mex автоматически выбирает MinGW и для C и для файлов MEX C++. Если у вас есть несколько C или компиляторы C++, используйте mex -setup, чтобы выбрать MinGW и для C и при необходимости для файлов MEX C++.
mex -setup mex -setup cpp
Если вы только вводите MinGW выбора mex -setup, когда вы компилируете файл C++, mex может выбрать различный компилятор.
Когда вы устанавливаете MinGW из меню MATLAB Add-Ons, MATLAB автоматически обнаруживает компилятор MinGW.
При необходимости можно вручную сконфигурировать MinGW, если у вас есть административные привилегии Windows®, с помощью скрипта configuremingw. Чтобы загрузить этот скрипт, см. статью MATLAB Answers, "У меня уже есть MinGW на моем компьютере. Как я конфигурирую его, чтобы работать с MATLAB".
При изменении флагов компилятора с помощью команды mex используйте флаги компилятора Linux® CFLAGS или CXXFLAGS вместо флага Windows COMPFLAGS.
Обработка ошибок в файлах MEX C++, скомпилированных с компилятором MinGW-w64, не сопоставима с обработкой ошибок MATLAB. Если файл MEX C++ содержит класс, использование функции mexErrMsgIdAndTxt, чтобы выдать исключение MEX может вызвать утечку памяти для объектов, созданных для класса.
Например, следующая MEX-функция C++ содержит класс 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.");
}
}
MEX-функция создает объект X из MyClass, затем проверяет количество входных параметров. Если MEX-функция вызывает mexErrMsgIdAndTxt, обработка ошибок MATLAB не освобождает память для объекта X, таким образом создавая утечку памяти.
Если функция в файле MEX C++ выдает явное исключение, которое не отловлено в файле MEX с оператором catch, то исключение заставляет MATLAB останавливаться вместо того, чтобы распространить ошибку к командной строке MATLAB.
#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();
}MEX-функция вызывает createMyClass, который создает объект класса MyClass и вызывает функциональный doErrorChecking. Функциональный doErrorChecking выдает исключение типа error. Это исключение, однако, не отловлено в файле MEX и заставляет MATLAB отказывать.
Это поведение также происходит для классов, наследовавшихся классу std::exception.
Отловите исключение в MEX-функции:
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
try{
createMyClass();
}
catch(error e){
// Error handling
}
}