Поиск и устранение проблем и Ограничения при компиляции Файлы MEX C/C++ с MinGW-w64

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

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

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

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

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

C:\Program Files\mingw-64

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

C:\mingw-64

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

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

Когда вы устанавливаете MinGW из меню MATLAB Add-Ons, MATLAB автоматически обнаруживает компилятор MinGW.

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

MinGW Ведет себя Так же к gcc/g ++ на Linux

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

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

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

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

Смотрите также

Похожие темы