Публикация интерфейса в общей библиотеке C++ на Linux

Этот пример создает MATLAB® интерфейс к библиотеке C++ matrixOperations для Linux®. Процесс включает в себя:

  • Сгенерируйте файл определения (definematrixlib.mlx).

  • Измените файл определения, чтобы завершить все определения, которые MATLAB не может автоматически преобразовать.

  • Создайте интерфейс библиотеки.

Для получения дополнительной информации смотрите Сборка интерфейса MATLAB к библиотеке C++.

MATLAB предоставляет библиотеку C++ и заголовочные файлы для использования в этом примере. Файлы находятся в этой папке и ее подпапках:

fullfile(matlabroot,'extern','examples','cpp_interface');

Сгенерируйте файл определения

Первый шаг для генерации интерфейса - подготовка необходимых папок и файлов и вызов clibgen.generateLibraryDefinition чтобы сгенерировать файл определения.

Проверьте поддерживаемый компилятор C++

Чтобы создать интерфейс, используйте тот же компилятор, который использовался для создания библиотеки C++.

mex -setup cpp

Создание папки издателя

Создайте папку для файла интерфейса MATLAB.

pubPath = "~/MATLAB/publisher/matrixexample/";
if ~isfolder(pubPath)
    mkdir(pubPath)
end
cd(pubPath)

Идентифицируйте файлы библиотеки C++

Идентифицируйте имена и пути к программным продуктам библиотеки C++.

productPath = fullfile(matlabroot,'extern','examples','cpp_interface');
libPath = fullfile(productPath,'glnxa64');
% Header file name
hppFile = 'matrixOperations.hpp';
% Full path to folder containing all header files
hppPath = productPath;
% Full path to folder containing include files
iPath = hppPath;
% Library file name
libFile = 'libmwmatrixOperations.so';

Назовите интерфейс

По умолчанию MATLAB создает интерфейс с именем matrixOperations. В данном примере измените имя на matrixlib.

libname = "matrixlib";

Звонить clibgen.generateLibraryDefinition

Чтобы создать интерфейс, вы должны задать:

  • Имя файла заголовка matrixOperations.hpp и его местоположение.

  • Путь к папке, содержащей файлы include, с помощью 'IncludePath' аргумент.

  • Имя и расположение файла библиотеки matrixOperations.lib, с использованием 'Libraries' аргумент.

Вы также можете:

  • Переименуйте библиотеку, используя 'PackageName' аргумент.

  • Отображать сообщения генерации, используя 'Verbose' аргумент.

clibgen.generateLibraryDefinition(fullfile(hppPath,hppFile),...
'IncludePath', iPath,... 
'Libraries', fullfile(libPath,libFile),... 
'PackageName', libname,...
'ReturnCArrays',false,... % treat output as MATLAB arrays
'Verbose',true)

Проверьте библиотеку.

definematrixlib;

Просмотр функциональности

Хотя некоторые конструкции требуют дополнительного определения, можно просмотреть доступные функциональные возможности. Если этой функциональности достаточно для ваших нужд, можно продолжить выполнение шага Build Library Interface. В противном случае перейдите к шагу Задать отсутствующие конструкции.

summary(definematrixlib)
MATLAB Interface to matrixlib Library

Class clib.matrixlib.Mat

  Constructors:
    clib.matrixlib.Mat()
    clib.matrixlib.Mat(clib.matrixlib.Mat)

  Methods:
    uint64 getLength()

  No Properties defined

Functions
  clib.matrixlib.updateMatByX(clib.matrixlib.Mat,int32)

Задайте отсутствующие конструкции

Чтобы определить отсутствующие конструкции, щелкните ссылку в generateLibraryDefinition выводить сообщение для редактирования определений в definematrixlib.mlx. Для получения информации об изменении этого файла и примеров для определения аргументов смотрите Задать отсутствующие сведения для сигнатур MATLAB.

  1. Поиск файла определения для setMat метод и раскомментируйте операторы, определяющие его. Чтобы определить src аргумент, в этом defineArgument оператор, замените <SHAPE> с "len".

    defineArgument(setMatDefinition, "src", "clib.array.matrixlib.Int", "input", "len");
  2. В методе getMat, задайте RetVal вывод путем замены <SHAPE> с "len".

    defineOutput(getMatDefinition, "RetVal", "int32", "len");
  3. В методе copyMat, задайте dest аргумент путем замены <SHAPE> с "len".

    defineArgument(copyMatDefinition, "dest", "clib.array.matrixlib.Int", "input", "len");
  4. В функциональном addMat, задайте mat аргумент в addMat функций путем замены <SHAPE> с 1.

    defineArgument(addMatDefinition, "mat", "clib.matrixlib.Mat", "input", 1);
  5. В функциональном updateMatBySize, задайте arr аргумент путем замены <SHAPE> с "len".

    defineArgument(updateMatBySizeDefinition, "arr", "clib.array.matrixlib.Int", "input", "len");

Сохраните и закройте файл определения.

Построение библиотечного интерфейса

Создайте файл интерфейса MATLAB matrixlibInterface.dll.

build(definematrixlib)
Building interface file 'matrixlibInterface.dll'.
Interface file 'matrixlibInterface.dll' built in folder 
'MATLAB/publisher/matrixexample/matrixlib'.
To use the library, add the interface file folder to the MATLAB path.

Обязательно щелкните ссылку в сообщении, чтобы добавить файл интерфейса к пути.

Тестируйте интерфейс

Для тестирования интерфейса смотрите Вызовы функций в Linux Interface to C++ Shared Library.

См. также

Похожие темы