exponenta event banner

Устранение неполадок и ограничения при компиляции файлов C/C + + MEX с MinGW-w64

Не связываться с файлами библиотеки, скомпилированными компиляторами, отличными от MinGW

Если компилятор MinGW ® используется для создания MEX-файла, который ссылается на библиотеку, скомпилированную с помощью компилятора, отличного от MinGW, например Microsoft ® Visual Studio ®, файл не будет выполняться в MATLAB ®. Библиотека (.lib) файлы, созданные различными компиляторами, несовместимы друг с другом.

Можно создать новый файл библиотеки с помощью dlltool утилита из MinGW.

Папка установки MinGW не может содержать места

Не устанавливайте MinGW в папку с пробелами в имени пути. Например, не используйте:

C:\Program Files\mingw-64

Вместо этого используйте:

C:\mingw-64

Команда MEX не выбирает MinGW

Если в системе установлен только компилятор 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 вручную

При установке MinGW из меню MATLAB Add-On MATLAB автоматически обнаруживает компилятор MinGW.

При необходимости можно вручную настроить MinGW, если у вас есть права администратора Windows ®, с помощью configuremingw сценарий. Чтобы загрузить этот сценарий, см. статью MATLAB Answers "У меня уже есть MinGW на компьютере. Как настроить его для работы с MATLAB ".

Поведение MinGW аналогично gcc/g + + в Linux

При изменении флагов компилятора с помощью mex используйте флаги компилятора Linux ®CFLAGS или CXXFLAGS вместо флага Windows COMPFLAGS.

Потенциальная утечка памяти внутри файлов C++ MEX при использовании исключений MEX

Обработка ошибок в файлах 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 неожиданно завершают MATLAB

Если функция в файле 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
    }
}

См. также

Связанные темы