Если вы используете MinGW® компилятор для создания файла MEX, который соединяется с библиотекой, скомпилированной компилятором, отличным от MinGW, таким как Microsoft® Визуальная студия®файл не будет запускаться в MATLAB®. Библиотека (.lib
) файлы, сгенерированные различными компиляторами, несовместимы друг с другом.
Можно сгенерировать новый файл библиотеки с помощью dlltool
утилита от MinGW.
Не устанавливайте MinGW в месте с пространствами в имени пути. Для примера не используйте:
C:\Program Files\mingw-64
Вместо этого используйте:
C:\mingw-64
Если в системе установлен только компилятор MinGW, mex
команда автоматически выбирает MinGW для файлов MEX на C и C++. Если у вас есть несколько компиляторов C или C++, используйте mex -setup
выбрать MinGW для файлов MEX на C и, при необходимости, на C++.
mex -setup mex -setup cpp
Если вы вводите только mex -setup
выбирая MinGW, когда вы компилируете файл C++, mex
можно выбрать другой компилятор.
При установке MinGW из меню Add-Ons MATLAB 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 Matrix. Для получения дополнительной информации смотрите Приложения 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
, таким образом создавая утечку памяти.
Если функция в файле 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 } }