Разработайте интерфейс для внешнего кода C/C++

Можно разработать интерфейс к внешнему коду при помощи базового класса 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 и сгенерированного кода

Параметризуйте методы, которые вызывают внешние функции так, чтобы методы, запущенные в 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 для Нескольких Платформ

Параметризуйте 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

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

| | | |

Похожие темы