Если вы используете 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
Если вы только вводите mex -setup
выбор MinGW, когда вы компилируете файл 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 может вызвать утечку памяти для объектов, созданных для класса.
MathWorks рекомендует, чтобы вы использовали API C++ MEX вместо Матричного API C. Для получения дополнительной информации см. Приложения C++ 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 } }