ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

coder.ExternalDependency クラス

パッケージ: coder
スーパークラス:

外部コードへのインターフェイス

説明

coder.ExternalDependency は、コード生成のために、外部コードと MATLAB® コード間のインターフェイスを開発する抽象クラスです。coder.ExternalDependency から派生するクラスを定義して、外部ライブラリ、オブジェクト ファイルおよび C/C++ ソース コードに対するインターフェイスをカプセル化できます。このカプセル化を使用して、インターフェイスの詳細を MATLAB コードから分離できます。

coder.ExternalDependency から派生したクラスを定義するには、サブクラスを作成します。次に例を示します。

classdef myClass < coder.ExternalDependency

メソッドにリストされているすべてのメソッドを定義しなければなりません。これらのメソッドは静的で、コンパイルされません。コード ジェネレーターは、コード生成が完了して生成されたコードのビルドを設定した後に MATLAB でこれらのメソッドを呼び出します。ビルド情報とビルド コンテキストを記述する RTW.BuildInfo オブジェクトおよび coder.BuildConfig オブジェクトは、ビルド プロセス中に自動的に作成されます。updateBuildInfo メソッドは、これらのオブジェクトへのアクセスを提供します。ビルド情報のカスタマイズの詳細については、ビルド プロセスのカスタマイズ (MATLAB Coder)を参照してください。

また、外部コードを呼び出すメソッドも定義します。これらのメソッドはコンパイルされます。呼び出す外部関数ごとに、関数に対するプログラミング インターフェイスを定義するメソッドを記述します。このメソッドでは、関数 coder.ceval を使用して外部関数を呼び出します。

メソッド

getDescriptiveName外部依存関係の記述名の返却
isSupportedContextビルド コンテキストが外部依存関係をサポートするかどうかを判別
updateBuildInfoビルド情報の更新

すべて折りたたむ

この例では、coder.ExternalDependency を使用して外部 C ダイナミック リンク ライブラリに対するインターフェイスをカプセル化する方法を示します。

入力の合計を返す関数 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 を呼び出す関数 adder_main を記述します。

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

adder_main の MEX 関数を生成します。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 で導入