Этот пример основан на платформе 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
build
| clibgen.generateLibraryDefinition