Опция library wrapper на C++ позволяет вам создать общую библиотеку из произвольного набора MATLAB® файлы. MATLAB Compiler SDK™ генерирует файл оболочки и файла заголовка. Заголовочный файл содержит все точки входа для всех скомпилированных функций MATLAB.
Этот пример переписывает пример разделяемой библиотеки C с помощью C++. Процедура создания общей библиотеки C++ из файлов MATLAB идентична процедуре создания общей библиотеки C, кроме тех случаев, когда вы используете cpplib
обертка. Введите следующую команду в одной линии:
mcc -W cpplib:libmatrix -T link:lib addmatrix.m multiplymatrix.m eigmatrix.m -v
The -W cpplib:<libname>
опция сообщает MATLAB Compiler SDK сгенерировать оболочку функций для общей библиотеки и вызвать ее <libname>
. The -T link:lib
опция задаёт конечный выход как общую библиотеку. Обратите внимание на директорию, в котором продукт помещает общую библиотеку, поскольку она понадобится позже.
Примечание
Из-за искривления имен в C++ необходимо скомпилировать приложение драйвера с той же версией стороннего компилятора, которую вы используете для компиляции общей библиотеки C++.
В версии C++ matrix
прикладные matrix_mwarray.cpp
, массивы представлены объектами класса mwArray
. Каждый mwArray
объект класса содержит указатель на структуру массива MATLAB. По этой причине атрибуты mwArray
объект является супермножеством атрибутов массива MATLAB. Каждый массив MATLAB содержит информацию о размере и форме массива (т.е. количестве строк, столбцов и страниц) и одном или двух массивах данных. Первый массив хранит вещественную часть данных массива, а второй массив хранит мнимую деталь. Для массивов без мнимой детали второй массив отсутствует. Данные в массиве расположены в порядке «основной столбец», а не «основная строка».
Внимание
Избегайте выдачи cd
команды из приложения драйвера перед вызовом mclInitializeApplication
. Отказ для этого может вызвать отказ в MATLAB Runtime инициализации.
Дополнительные сведения о том, как MATLAB Compiler SDK использует слой прокси для библиотек, которые должно связывать приложение, см. в разделе «Сведения о слое прокси-сервера mclmcrrt».
The matrix_mwarray.cpp
файл драйвера расположен в matlabroot\extern\examples\compilersdk\c_cpp\matrix
.
Чтобы скомпилировать matrix_mwarray.cpp
код драйвера, вы используете ваш компилятор C++. Путем выполнения следующей mbuild
команда, которая соответствует вашей платформе разработки, вы будете использовать компилятор C++ для компиляции кода.
mbuild matrix_mwarray.cpp libmatrix.lib (Windows) mbuild matrix_mwarray.cpp -L. -lmatrix -I. (UNIX)
Примечание
Эта команда принимает, что общая библиотека и соответствующий файл заголовка находятся в текущей рабочей директории.
В Windows®, если это не так, задайте полный путь к libmatrix.lib
, и использовать -I
опция для задания директории, содержащей файл заголовка.
В UNIX®, если это не так, замените ".
"(точка) после -L
и -I
опции с именем директории, содержащего эти файлы, соответственно.
Существуют два основных различий при использовании общей библиотеки C++:
Функции интерфейса используют mwArray
тип для передачи аргументов, а не mxArray
тип, используемый в разделяемых библиотеках на С.
Исключения C++ используются для сообщения об ошибках вызывающему абоненту. Поэтому все вызовы должны быть упакованы в try-catch
блок.
Целевой объект общей библиотеки C++ генерирует два набора интерфейсов для каждой функции MATLAB. Для получения дополнительной информации смотрите Функции, сгенерированные из файлов MATLAB. Типовая сигнатура экспортированных функций C++ выглядит следующим образом:
Функции MATLAB без возвращаемых значений
bool MW_CALL_CONV <function-name>(<const_mwArray_references>);
Функции MATLAB с по крайней мере одним возвращаемым значением
bool MW_CALL_CONV <function-name>(int <number_of_return_values>, <mwArray_references>, <const_mwArray_references>);
В этом случае const_mwArray_references
представляет списку , разделенному запятыми ссылок типа const mwArray&
и mwArray_references
представляет списку , разделенному запятыми ссылок типа mwArray&
. Для примера, в libmatrix
библиотека, интерфейс C++ к addmatrix
Функция MATLAB генерируется как:
void addmatrix(int nargout, mwArray& a, const mwArray& a1, const mwArray& a2);
где a
является выходным параметром и a1
и a2
являются входными параметрами.
Входные параметры переданы в функцию MATLAB через varargin
должна быть передана через одну mwArray
это массив ячеек. Каждый элемент массива ячеек должен составлять входной параметр. Выходные аргументы, извлеченные из функции MATLAB через varargout
должна быть извлечена через одну mwArray
это массив ячеек. Каждый элемент массива ячеек будет представлять собой выходной аргумент. Количество элементов в массиве ячеек будет равно number_of_return_values
- количество именованных выходных параметров. Также обратите внимание, что,
Если функция MATLAB принимает varargin
аргумент, функция C++ должна быть передана mwArray
соответствующий этому varargin
, даже если mwArray
пуст.
Если функция MATLAB принимает varargout
аргумент, функция C++ должна быть передана mwArray
соответствующий этому varargin
, даже если number_of_return_values
задается количество именованных выходных аргументов, что означает, что varargout
будет пустым.
The varargout
аргумент должен следовать любым именованным выходным аргументам и предшествовать любым входным параметрам.
The varargin
аргумент должен быть последним аргументом.
Функции интерфейса C++ обрабатывают ошибки во время выполнения, выдавая исключение C++. Используйте mwException
класс для этой цели. Ваше приложение может поймать mwExceptions
и запросите what()
метод для получения сообщения об ошибке. Чтобы правильно обработать ошибки при вызове функций интерфейса C++, переносите каждый вызов внутрь try-catch
блок.
try { ... (call function) ... } catch (const mwException& e) { ... (handle error) ... }
The matrix_mwarray.cpp
приложение иллюстрирует типичный способ обработки ошибок при вызове функций интерфейса C++.
MATLAB Compiler SDK C/C + + API включает статические заводские методы работы с разреженными массивами.
Полный список методов см. в разделе C++ Utility Classes.