кодер. Класс ExternalDependency

Пакет: кодер
Суперклассы:

Интерфейс к внешнему коду

Описание

coder.ExternalDependency является абстрактным классом для разработки интерфейса между внешним кодом и кодом MATLAB®, предназначенным для генерации кода. Можно задать классы, которые выводят от coder.ExternalDependency, чтобы инкапсулировать интерфейс к внешним библиотекам, объектным файлам и исходному коду C/C++. Эта инкапсуляция позволяет вам разделять детали интерфейса из вашего кода MATLAB.

Чтобы задать класс, выведенный от coder.ExternalDependency, создайте подкласс. Например:

classdef myClass < coder.ExternalDependency

Необходимо задать все методы, перечисленные в Методах. Эти методы статичны и не скомпилированы. Генератор кода вызывает эти методы в MATLAB после того, как генерация кода будет завершена, чтобы сконфигурировать сборку для сгенерированного кода. RTW.BuildInfo и объекты coder.BuildConfig, которые описывают информацию о сборке и создают контекст, автоматически создаются во время процесса сборки. Метод updateBuildInfo обеспечивает доступ к этим объектам. Для получения дополнительной информации об индивидуальной настройке информации о сборке смотрите Индивидуальную настройку Процесса сборки.

Вы также задаете методы, которые вызывают внешний код. Эти методы скомпилированы. Для каждой внешней функции, которую вы хотите вызвать, запишите метод, чтобы задать интерфейс программирования к функции. В методе используйте coder.ceval, чтобы вызвать внешнюю функцию.

Методы

getDescriptiveNameВозвратите описательное имя для внешней зависимости
isSupportedContextОпределите, поддерживает ли контекст сборки внешнюю зависимость
updateBuildInfoОбновите информацию о сборке

Примеры

свернуть все

Этот пример показывает, как инкапсулировать интерфейс к внешней динамически подключаемой библиотеке C с помощью coder.ExternalDependency.

Запишите функциональный adder, который возвращает сумму его входных параметров.

function c = adder(a,b)
%#codegen
c = a + b;
end

Сгенерируйте библиотеку, которая содержит adder.

codegen('adder','-args',{-2,5},'-config:dll','-report')

Запишите файл определения класса AdderAPI.m, чтобы инкапсулировать интерфейс библиотеки.

%================================================================
% This class abstracts the API to an external Adder library.
% It implements static methods for updating the build information
% at compile time and build time.
%================================================================

classdef AdderAPI < coder.ExternalDependency
    %#codegen
    
    methods (Static)
        
        function bName = getDescriptiveName(~)
            bName = 'AdderAPI';
        end
        
        function tf = isSupportedContext(buildContext)
            if  buildContext.isMatlabHostTarget()
                tf = true;
            else
                error('adder library not available for this target');
            end
        end
        
        function updateBuildInfo(buildInfo, buildContext)
            % Get file extensions for the current platform
            [~, linkLibExt, execLibExt, ~] = buildContext.getStdLibInfo();
            
            % Add file paths
            hdrFilePath = fullfile(pwd, 'codegen', 'dll', 'adder');
            buildInfo.addIncludePaths(hdrFilePath);

            % Link files
            linkFiles = strcat('adder', linkLibExt);
            linkPath = hdrFilePath;
            linkPriority = '';
            linkPrecompiled = true;
            linkLinkOnly = true;
            group = '';
            buildInfo.addLinkObjects(linkFiles, linkPath, ...
                linkPriority, linkPrecompiled, linkLinkOnly, group);

            % Non-build files for packaging
            nbFiles = 'adder';
            nbFiles = strcat(nbFiles, execLibExt);
            buildInfo.addNonBuildFiles(nbFiles,'','');
        end
        
        %API for library function 'adder'
        function c = adder(a, b)
            if coder.target('MATLAB')
                % running in MATLAB, use built-in addition
                c = a + b;
            else
                % Add the required include statements to the generated function code
                coder.cinclude('adder.h');
                coder.cinclude('adder_initialize.h');
                coder.cinclude('adder_terminate.h');
                c = 0;
                
                % Because MATLAB Coder generated adder, use the
                % housekeeping functions before and after calling
                % adder with coder.ceval.

                coder.ceval('adder_initialize');
                c = coder.ceval('adder', a, b);
                coder.ceval('adder_terminate');
            end
        end
    end
end

Запишите функциональный adder_main, который вызывает внешнюю библиотечную функцию adder.

function y = adder_main(x1, x2)
    %#codegen
    y = AdderAPI.adder(x1, x2);
end

Сгенерируйте MEX-функцию для adder_main. MEX-функция осуществляет методы coder.ExternalDependency.

codegen('adder_main','-args',{7,9},'-report')

Скопируйте библиотеку в текущую папку с помощью расширения файла для платформы. Для Windows® используйте:

copyfile(fullfile(pwd,'codegen','dll','adder','adder.dll'));

Для Linux® используйте:

copyfile(fullfile(pwd,'codegen','dll','adder','adder.so'));

Запустите MEX-функцию и проверьте результат.

adder_main_mex(2,3)

Введенный в R2013b