Можно разработать интерфейс к внешнему коду при помощи базового класса coder.ExternalDependency
. Используя класс для внешнего кода может обеспечить определенные преимущества. Вы можете:
Связанные с местом функции в один пакет, не представляя их пользователю (инкапсуляция).
Создайте расширяемый интерфейс, который может быть совместно использован через проекты.
Задайте сделанные на заказ параметры конфигурации так, чтобы информация о сборке была предварительно сконфигурирована.
coder.ExternalDependency
Инстанцировать класса вывело из абстрактного класса coder.ExternalDependency
, необходимо задать методы getDescriptiveName
, isSupportedContext
и updateBuildInfo
. Эти методы создание отчетов ошибки адресации, создайте поддержку и конфигурацию сборки.
Считайте пример подкласса под названием myExternalMathAPI
выведенным от coder.ExternalDependency
. Этот подкласс принимает, что у вас есть весь свой необходимый источник и заголовочные файлы, содержавшиеся в вашей текущей рабочей папке без других зависимостей. Если у вас есть дополнительные зависимости, такие как источник, библиотека или заголовочные файлы, можно переопределить updateBuildInfo
или вывести подкласс от myExternalMathAPI
, который перегружает метод updateBuildInfo
по мере необходимости и добавляет новые методы в интерфейс. Чтобы помочь в конфигурации сборки, можно использовать информацию о сборке и создать объекты контекста, доступные методом updateBuildInfo
.
classdef myExternalMathAPI < coder.ExternalDependency %#codegen methods (Static) % Provide a name for use in error messages function bName = getDescriptiveName(~) bName = 'myExternalMathAPI'; end % Error out if build context is not supported function supported = isSupportedContext(buildContext) myTarget = {'mex','rtw'}; if buildContext.isCodeGenTarget(myTarget) supported = true; else error('API only supported for mex, lib, exe, dll'); end end % Configure simple build in this example % Redefine the method as necessary for your dependencies function updateBuildInfo(buildInfo, buildContext) src = {'extAdd.c','extSub.c','extDiv.c'}; buildInfo.addSourceFiles(src); end % Define class methods function c = add(a, b) coder.cinclude('extAdd.h'); c = 0; c = coder.ceval('extAdd', a, b); end function c = subtract(a, b) coder.cinclude('extSubtract.h'); c = 0; c = coder.ceval('extSub', a, b); end function c = divide(a, b) coder.cinclude('extDivide.h'); c = 0; c = coder.ceval('extDiv', a, b); end end end
Вызовите внешний код C/C++ через интерфейс:
myExternalMathAPI.add(a,b); myExternalMathAPI.substract(a,b); myExternalMathAPI.divide(a,b);
coder.ExternalDependency
Метод isSupportedContext
возвращает true, если внешний интерфейс кода поддерживается в контексте сборки. Если внешний интерфейс кода не поддержан, используйте error
, чтобы отключить генерацию кода с сообщением об ошибке. Например:
function supported = isSupportedContext(buildContext) if buildContext.isMatlabHostTarget() supported = true; else error('MyLibrary is not available for this target'); end end
Параметризуйте методы, которые вызывают внешние функции так, чтобы методы, запущенные в MATLAB®. Например:
function c = add(a, b) if coder.target('MATLAB') % running in MATLAB, use built-in addition c = a + b; else % running in generated code, call library function c = 0; c = coder.ceval('extAdd', a, b); end end
Параметризуйте метод updateBuildInfo
, чтобы поддержать несколько платформ. Например, используйте coder.BuildConfig.getStdLibInfo
, чтобы получить специфичные для платформы расширения файла библиотеки.
function updateBuildInfo(buildInfo, buildContext) % Get file extensions for the current platform [~, linkLibExt, execLibExt, ~] = buildContext.getStdLibInfo(); % Parametrize library extension libName = strcat('myLib', linkLibExt); % Other linking parameters libPath = 'c:\Link_Objects'; libPriority = ''; libPreCompiled = true; libLinkOnly = true; % Linking command buildInfo.addLinkObjects(libName,libPath,libPriority,libPreCompiled,libLinkOnly); end
coder.BuildConfig
| coder.ExternalDependency
| coder.ceval
| coder.updateBuildInfo
| error