coder.ExternalDependency class

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

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

Описание

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

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

classdef myClass < coder.ExternalDependency

Необходимо определить все методы, перечисленные в Methods. Эти методы являются статическими и не компилируются. Генератор кода вызывает эти методы в MATLAB после того, как генерация кода завершена, чтобы сконфигурировать сборку для сгенерированного кода. The RTW.BuildInfo и coder.BuildConfig объекты, которые описывают информацию о сборке и контекст сборки, автоматически создаются в процессе сборки. The 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