Этот пример создает MATLAB® интерфейс к библиотеке C++ matrixOperations для Windows®. Для Linux® пример см. в разделе Публикация интерфейса в общей библиотеке C++ на Linux. Процесс включает в себя:
Сгенерируйте файл определения (definematrixlib.mlx).
Измените файл определения, чтобы завершить все определения, которые MATLAB не может автоматически преобразовать.
Создайте интерфейс библиотеки.
Для получения дополнительной информации смотрите Сборка интерфейса MATLAB к библиотеке C++.
MATLAB предоставляет библиотеку C++ и заголовочные файлы для использования в этом примере. Файлы находятся в этой папке и ее подпапках:
fullfile(matlabroot,'extern','examples','cpp_interface');
Первый шаг для генерации интерфейса - подготовка необходимых папок и файлов и вызов clibgen.generateLibraryDefinition чтобы сгенерировать файл определения.
Проверьте выбранный компилятор C++
Этот пример использует компилятор MinGW64. Убедитесь, что выбран этот компилятор.
mex -setup cpp
Также можно выбрать Visual Studio® компилятор. Установите значение для libPath как указано на шаге Идентифицировать файлы библиотеки C++.
Создание папки издателя
Создайте папку для файла интерфейса MATLAB. Это необязательный шаг.
pubPath = [pwd + "\matrixexample"]; if ~isfolder(pubPath) mkdir(pubPath) end cd(pubPath)
Идентифицируйте файлы библиотеки C++
Идентифицируйте имена и пути к программным продуктам библиотеки C++. Общая библиотека создана с помощью определенного компилятора. Существует две версии библиотеки. Один построен с помощью компилятора MinGW64, а другой с помощью компилятора Microsoft Visual Studio 2017. Установите значение libPath на основе выбранного компилятора.
productPath = fullfile(matlabroot,"extern","examples","cpp_interface"); % Link to library built with MinGW-w64 compiler libPath = fullfile(productPath,"win64","mingw64"); % To link to library built with the Visual Studio compiler, use this path instead: % libPath = fullfile(productPath,"win64","microsoft"); % 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 = "matrixOperations.lib";
Назовите интерфейс
По умолчанию 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)
Warning: Some C++ language constructs in the files for generating interface file are not supported and not imported. Using MinGW64 Compiler (C++) compiler. Generated definition file definematrixlib.mlx and data file 'matrixlibData.xml' contain definitions for 10 constructs supported by MATLAB. 5 construct(s) require(s) additional definition. To include these construct(s) in the interface, edit the definitions in definematrixlib.mlx. Build using build(definematrixlib).
Проверьте библиотеку.
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.
Поиск файла определения для setMat метод и раскомментируйте операторы, определяющие его. Чтобы определить src аргумент, в этом defineArgument оператор, замените <SHAPE> с "len".
defineArgument(setMatDefinition, "src", "clib.array.matrixlib.Int", "input", "len");
В методе getMat, задайте RetVal вывод путем замены <SHAPE> с "len".
defineOutput(getMatDefinition, "RetVal", "int32", "len");
В методе copyMat, задайте dest аргумент путем замены <SHAPE> с "len".
defineArgument(copyMatDefinition, "dest", "clib.array.matrixlib.Int", "input", "len");
В функциональном addMat, задайте mat аргумент в addMat функций путем замены <SHAPE> с 1.
defineArgument(addMatDefinition, "mat", "clib.matrixlib.Mat", "input", 1);
В функциональном 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 'C:\Documents\matrixexample\matrixlib'. To use the library, add the interface file folder to the MATLAB path.
Обязательно щелкните ссылку в сообщении, чтобы добавить файл интерфейса к пути.
Для тестирования интерфейса смотрите Вызовы функций в Интерфейсе Windows к разделяемой библиотеке C++.
clibgen.generateLibraryDefinition