exponenta event banner

Интеграция общих библиотек C++

Обертка общей библиотеки C++

Опция обертки библиотеки C++ позволяет создавать общую библиотеку из произвольного набора файлов MATLAB ®. Компилятор MATLAB SDK™ создает файл оболочки и файл заголовка. Файл заголовка содержит все точки входа для всех скомпилированных функций MATLAB.

Пример общей библиотеки C++

Этот пример переписывает пример общей библиотеки C с помощью C++. Процедура создания общей библиотеки C++ из файлов MATLAB идентична процедуре создания общей библиотеки C, за исключением использования cpplib обертка. Введите следующую команду в одной строке:

mcc -W cpplib:libmatrix -T link:lib addmatrix.m multiplymatrix.m eigmatrix.m -v

-W cpplib:<libname> указывает MATLAB Compiler SDK на создание оболочки функции для общей библиотеки и вызов ее <libname>. -T link:lib задает целевой вывод в качестве общей библиотеки. Обратите внимание на каталог, в который продукт помещает общую библиотеку, потому что она понадобится позже.

Запись приложения драйвера

Примечание

Из-за искажения имен в C++ необходимо скомпилировать приложение драйвера с той же версией стороннего компилятора, которая используется для компиляции общей библиотеки C++.

В версии C++ matrix приложение matrix_mwarray.cpp, массивы представлены объектами класса mwArray. Каждый mwArray объект класса содержит указатель на структуру массива MATLAB. По этой причине атрибуты mwArray объект - это супернабор атрибутов массива MATLAB. Каждый массив MATLAB содержит информацию о размере и форме массива (т.е. количество строк, столбцов и страниц) и один или два массива данных. Первый массив хранит действительную часть данных массива, а второй массив хранит мнимую часть. Для массивов без мнимой части второй массив отсутствует. Данные в массиве расположены в порядке «столбец-мажор», а не «строка-мажор».

Внимание

Избегать выдачи cd команды из приложения драйвера перед вызовом mclInitializeApplication. Это может привести к сбою при инициализации среды выполнения MATLAB.

Сведения о том, как MATLAB Compiler SDK использует уровень прокси для библиотек, которые должно связать приложение, см. в разделе Понимание уровня прокси mclmcrt.

matrix_mwarray.cpp файл драйвера находится в matlabroot\extern\examples\compilersdk\c_cpp\matrix.

 Код API C++ mwArray для реализации общей библиотеки

Компиляция приложения драйвера

Для компиляции 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++ в приложение

При использовании общей библиотеки C++ следует отметить два основных отличия:

  • Функции интерфейса используют mwArray тип для передачи аргументов, а не mxArray используется с общими библиотеками C.

  • Исключения 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 будет пустым.

  • varargout аргумент должен следовать любым именованным выходным аргументам и предшествовать любым входным аргументам.

  • varargin аргумент должен быть последним аргументом.

Обработка ошибок

Функции интерфейса C++ обрабатывают ошибки во время выполнения, создавая исключение C++. Используйте mwException класс для этой цели. Ваше приложение может поймать mwExceptions и запросите what() для получения сообщения об ошибке. Чтобы правильно обрабатывать ошибки при вызове функций интерфейса C++, переносите каждый вызов внутрь try-catch блок.

	try
{
		...
		(call function)
		...
}
catch (const mwException& e)
{
		...
		(handle error)
		...
}

matrix_mwarray.cpp приложение иллюстрирует типичный способ обработки ошибок при вызове функций интерфейса C++.

Работа с общими библиотеками C++ и разреженными массивами

Компилятор MATLAB SDK C/C + + API включает статические заводские методы для работы с разреженными массивами.

Полный список методов см. в разделе Служебные классы C++.

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