Интеграция разделяемых библиотек C++

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

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

Пример разделяемой библиотеки C++

Этот пример переписывает пример разделяемой библиотеки 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.

 Код 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++ используются для сообщения об ошибках вызывающему абоненту. Поэтому все вызовы должны быть упакованы в 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++.

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

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

Полный список методов см. в разделе C++ Utility Classes.

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте