Если компилятор MinGW ® используется для создания MEX-файла, который ссылается на библиотеку, скомпилированную с помощью компилятора, отличного от MinGW, например Microsoft ® Visual Studio ®, файл не будет выполняться в MATLAB ®. Библиотека (.lib) файлы, созданные различными компиляторами, несовместимы друг с другом.
Можно создать новый файл библиотеки с помощью dlltool утилита из MinGW.
Не устанавливайте MinGW в папку с пробелами в имени пути. Например, не используйте:
C:\Program Files\mingw-64
Вместо этого используйте:
C:\mingw-64
Если в системе установлен только компилятор MinGW, mex команда автоматически выбирает MinGW для файлов C и C++ MEX. При наличии нескольких компиляторов C или C++ используйте mex -setup для выбора MinGW для файлов C и, при необходимости, для файлов C++ MEX.
mex -setup mex -setup cpp
Если ввести только mex -setup выбирая MinGW при компиляции файла C++, mex может выбрать другой компилятор.
При установке MinGW из меню MATLAB Add-On MATLAB автоматически обнаруживает компилятор MinGW.
При необходимости можно вручную настроить MinGW, если у вас есть права администратора Windows ®, с помощью configuremingw сценарий. Чтобы загрузить этот сценарий, см. статью MATLAB Answers "У меня уже есть MinGW на компьютере. Как настроить его для работы с MATLAB ".
При изменении флагов компилятора с помощью mex используйте флаги компилятора Linux ®CFLAGS или CXXFLAGS вместо флага Windows COMPFLAGS.
Обработка ошибок в файлах C++ MEX, скомпилированных компилятором MinGW-w64, не согласуется с обработкой ошибок MATLAB. Если файл C++ MEX содержит класс, используйте mexErrMsgIdAndTxt функция создания исключения MEX может вызвать утечку памяти для объектов, созданных для класса.
MathWorks рекомендует использовать API C++ MEX вместо API C Matrix. Дополнительные сведения см. в разделе Приложения C++ MEX.
Например, следующая функция C++ MEX содержит класс 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, таким образом создавая утечку памяти.
Если функция в файле C++ MEX создает явное исключение, которое не перехватывается в файле 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
}
}