Задайте и опубликуйте интерфейс на C++ разделяемая библиотека

Этот пример основан на платформе Windows® с компилятором MinGW64.

Скопируйте исходные файлы в качестве примера matrixOperations.hpp, matrixOperations.cpp и cppshrhelp.hpp к перезаписываемой папке на вашем пути.

copyfile(fullfile(matlabroot,'extern','examples','cpp_interface','matrixOperations.*'),'.','f')
copyfile(fullfile(matlabroot,'extern','examples','cpp_interface','cppshrhelp.hpp'),'.','f')

Создайте подпапку для специфичных для компилятора совместно использованных файлов библиотеки.

if ~isdir('win64')
    mkdir('win64')
    if ~isdir(fullfile('win64','mingw64'))
        mkdir(fullfile('win64','mingw64'))        
    end
end

Скопируйте файлы библиотеки в подпапку.

copyfile(fullfile(matlabroot,'extern','examples','cpp_interface','win64','mingw64','*.*'),...
fullfile('win64','mingw64'),'f')

Выйдите из MATLAB® и установите путь к операционной системе от системного приглашения DOS. Этот пример принимает, что вы копируете файлы исходного кода в качестве примера в папку 'H:\Documents\MATLAB\publisher\matrixexample', которая является productPath. Пример принимает, что вы копируете совместно использованные файлы библиотеки в папку 'H:\Documents\MATLAB\publisher\matrixexample\win64\mingw64', которая является libPath.

set PATH=productPath;%PATH%
set PATH=libPath;%PATH%

Перезапустите MATLAB.

Исследуйте вывод этой команды, чтобы проверить, что productPath и libPath находятся на вашем системном пути.

syspath = split(getenv('path'),';')
{'H:\Documents\MATLAB\publisher\matrixexample\win64\mingw64'}
{'H:\Documents\MATLAB\publisher\matrixexample'}

Проверьте свой компилятор C++.

mex -setup c++
MEX configured to use 'MinGW64 Compiler (C++)' for C++ language compilation.

Установите следующие значения.

% Full path to files in the library
productPath = 'H:\Documents\MATLAB\publisher\matrixexample';
% 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;
% Full path to folder containing library files. This example uses the MinGW-w64 compiler.
libPath = fullfile(productPath,'win64','mingw64');
% Library file name
libFile = 'matrixOperations.lib';

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

myPkg = 'myPkg';

Сгенерируйте определение библиотеки.

v = false;
clibgen.generateLibraryDefinition(fullfile(hppPath,hppFile),...
'IncludePath', iPath,... 
'Libraries', fullfile(libPath,libFile),... 
'PackageName', myPkg,...
'Verbose',v)
Using MinGW64 Compiler (C++) compiler.
Generated definition file definemyPkg.mlx and data file 'myPkgData.xml' contain definitions for 
10 constructs supported by MATLAB.
5 constructs require additional definition. To include these constructs in the interface, 
edit the definitions in definemyPkg.mlx.
Build using build(definemyPkg).

Чтобы задать недостающие построения, щелкните по ссылке, чтобы открыть файл определения definemyPkg.mlx.

Задайте аргумент src в методе класса C++ setMat. Ищите файл определения setMat и не прокомментируйте операторы, задающие его. В этом операторе defineArgument замените <DIRECTION> на "input" и <SHAPE> с "len".

defineArgument(setMatDefinition, "src", "int32", "input", "len");

Задайте RetVal вывод в методе getMat. Замените <SHAPE> на "len".

defineOutput(getMatDefinition, "RetVal", "int32", "len");

Задайте аргумент dest в методе copyMat. Замените <DIRECTION> на "output" и <SHAPE> с "len".

defineArgument(copyMatDefinition, "dest", "int32", "output", "len");

Задайте аргумент mat в функциональном addMat. Замените <SHAPE> на 1.

defineArgument(addMatDefinition, "mat", "clib.matrixOperations.Mat", "input", 1);

Задайте аргумент arr в функциональном updateMatBySize. Замените <DIRECTION> на "input" и <SHAPE> с "len".

defineArgument(updateMatBySizeDefinition, "arr", "int32", "input", "len");

Создайте интерфейс.

build(definemyPkg)
Building interface file 'myPkgInterface.dll'.
Interface file 'myPkgInterface.dll' built in folder 
'H:\Documents\MATLAB\publisher\matrixexample\myPkg'.
To use the library, add the interface file folder to the MATLAB path.

Просмотрите содержимое интерфейса.

summary(definemyPkg)
MATLAB Interface to myPkg Library

Class clib.myPkg.Mat

  Constructors:
    clib.myPkg.Mat()
    clib.myPkg.Mat(clib.myPkg.Mat)

  Methods:
    setMat(int32)
    int32 getMat(uint64)
    uint64 getLength()
    int32 copyMat(uint64)

  No Properties defined

Functions
  int32 clib.myPkg.addMat(clib.myPkg.Mat)
  clib.myPkg.updateMatByX(clib.myPkg.Mat,int32)
  clib.myPkg.updateMatBySize(clib.myPkg.Mat,int32)

Протестируйте функции в интерфейсе. Например:

matObj = clib.myPkg.Mat;
intArr = [1,2 3,4,5];
matObj.setMat(intArr);
retMat = matObj.getMat(5)
retMat = 1×5 int32 row vector
   1   2   3   4   5

Смотрите также

|

Похожие темы