メインコンテンツ

複数のエントリポイント関数のためのコード生成

エントリポイント関数は、生成されたコードへの安定したインターフェイスです。多くのアプリケーションでは、単一のエントリポイント関数のコードのみを生成する必要があります。ただし、複数のエントリポイント関数の C/C++ コードを同時に生成することもできます。複数のエントリポイント関数を使用すると、以下を実行できます。

  • エントリポイント関数ごとに独立したライブラリよりも優れた機能をもつ共有 C/C++ ライブラリを生成する

  • 複数のエントリポイント関数で使用されるサブ関数をより効率的に共有するコードを生成する

  • 同じ global 変数または persistent 変数を使用する場合など、共有メモリを使用して通信できるライブラリ関数を生成する

C/C++ ライブラリを生成する前に、MATLAB® でエントリポイントの動作を検証する MEX 関数を生成することをお勧めします。MEX 関数を使用した MATLAB コードの問題の確認を参照してください。

複数のエントリポイント関数の指定

複数のエントリポイント関数を指定するには、次のいずれかの方法を使用します。

  • MATLAB Coder™ アプリを使用する場合、[エントリ ポイント] ペインで複数のエントリポイント関数を追加する。

  • コマンド ラインで codegen コマンドを使用してコードを生成する場合、スペース区切りリストでエントリポイント関数の後に関数引数を指定する。たとえば、それぞれ 2 つのスカラー double の入力を受け取るエントリポイント関数 myMult および myAdd のコードを生成するには、次のコマンドを使用します。

    codegen myMult -args {0,0} myAdd -args {0,0}

    入力型の指定の詳細については、エントリポイント関数の入力の型の指定を参照してください。

共有 MEX 関数の作成

複数のエントリポイント関数の MEX 関数を生成すると、コードは単一の共有 MEX 関数を生成します。共有 MEX 関数の既定の名前と場所は、コードの生成をコマンド ラインで行うのか MATLAB Coder アプリを使用して行うのかによって異なります。

MATLAB Coder アプリの使用

MATLAB Coder アプリを使用して MEX 関数を生成した場合、アプリは MATLAB Coder プロジェクト ファイルと同じ場所に MEX 関数を生成します。アプリは、[生成] ページの [出力ファイル名] プロパティに従って MEX 関数に名前を付けます。

コマンド ラインの入力

コマンド ラインで codegen コマンドを使用して MEX 関数を生成すると、コード ジェネレーターは MEX 関数を作業ディレクトリに保存します。コード ジェネレーターは、エントリポイント関数の 1 つの名前を使用して MEX 関数に名前を付けます。たとえば、関数 myMult と関数 myAdd のコードを名前空間 myNamespace に生成するとします。コード ジェネレーターは、作業ディレクトリに myMult_mex という名前の共有 MEX 関数を作成します。

codegen myMult -args {0,0} myNamespace.myAdd -args {0,0}

コード ジェネレーターは、myMult_mex という名前の共有 MEX 関数を作成します。

codegen コマンドの -o オプションを使用して、生成される MEX 関数の名前を指定できます。たとえば、名前空間 myNamespace に関数 myFun と関数 myAdd のコードを生成し、共有 MEX 関数の名前として myMath を指定します。コード ジェネレーターは、作業ディレクトリに myMath という名前の共有 MEX 関数を作成します。

codegen -o myMath myMult -args {0,0} myNamespace.myAdd -args {0,0}

共有 MEX 関数の使用

共有 MEX 関数から個々のエントリポイント関数を呼び出すには、エントリポイント関数の名前、そしてその後に続けて必要な入力を共有 MEX 関数に渡します。エントリポイント関数が名前空間内にある場合は、ドット表記を使用して関数を呼び出します。

たとえば、サンプル入力を指定して myMult に対して生成された MEX 関数を呼び出すには、次の構文を使用します。

myMath("myMult",5,6)
サンプル入力を指定して、名前空間 myNamespace にある myAdd に対して生成された MEX 関数を呼び出すには、次の構文を使用します。
myMath("myNamespace.myAdd",4,6)
名前空間内の関数のコード生成の詳細については、Code Generation for Entry-Point Functions in Namespacesを参照してください。

例: 複数のエントリポイント関数のコードの同時生成

この例では、2 つの関数用の複数シグネチャの MEX 関数およびスタンドアロン C コードを同時に生成する方法を示します。

関数の定義

名前空間 additionFunctions に関数 myAdd を定義します。この関数は 2 つの入力を加算します。

type(fullfile("+additionFunctions","myAdd.m"))
function out = myAdd(a,b)
out = a+b;
end

関数 myMult をベース名前空間に定義します。この関数は 2 つの入力を乗算します。

type myMult.m
function out = myMult(a,b)
out = a*b;
end

サンプル入力を使用して MATLAB で関数をテストします。

additionFunctions.myAdd(4,5)
ans = 
9
myMult(4,5)
ans = 
20

共有 MEX 関数の生成

codegen コマンドを使用して、2 つのエントリポイント関数用の共有 MEX 関数を生成します。各関数用に double 型の 2 つの入力引数を指定します。-o オプションを使用して、共有 MEX 関数に myMath という名前を付けます。コード ジェネレーターは、作業ディレクトリに MEX 関数 myMath を作成します。codegen/mex/myMath フォルダー内にソース、ヘッダー、およびオブジェクト ファイルが生成されます。

codegen -o myMath additionFunctions.myAdd -args {0 0} myMult -args {0 0}
Code generation successful.

エントリポイント関数ごとに共有 MEX 関数を呼び出します。myAdd を呼び出すときに名前空間を指定する必要があります。MATLAB で関数をテストするために使用したときと同じ引数を渡します。

myMath("additionFunctions.myAdd",4,5)
ans = 
9
myMath("myMult",4,5)
ans = 
20

C コードの生成

additionFunctions.myAddmyMult の C コードを同時に生成します。-config:lib オプションを使用して、C スタティック ライブラリのターゲットを指定します。-o オプションを使用して、共有ソース、ヘッダー、およびオブジェクト ファイルに名前を付けるときに myMath という名前を使用するようにコード ジェネレーターに指示します。

codegen -config:lib -o myMath additionFunctions.myAdd -args {0 0} myMult -args {0 0}
Code generation successful.

生成されたファイルを調べます。コード ジェネレーターは、生成されたファイルをフォルダー codegen/mex/myMath に保存します。コード ジェネレーターは、共有ソース、ヘッダー、およびオブジェクト ファイルの名前を myMath で始めますが、エントリポイント関数ごとに個別のソースおよびヘッダー ファイルを生成します。

type(fullfile("codegen","lib","myMath","additionFunctions_myAdd.c"))
/*
 * File: additionFunctions_myAdd.c
 *
 * MATLAB Coder version            : 25.1
 * C/C++ source code generated on  : 13-Jul-2025 16:33:52
 */

/* Include Files */
#include "additionFunctions_myAdd.h"

/* Function Definitions */
/*
 * Arguments    : double a
 *                double b
 * Return Type  : double
 */
double additionFunctions_myAdd(double a, double b)
{
  return a + b;
}

/*
 * File trailer for additionFunctions_myAdd.c
 *
 * [EOF]
 */
type(fullfile("codegen","lib","myMath","myMult.c"))
/*
 * File: myMult.c
 *
 * MATLAB Coder version            : 25.1
 * C/C++ source code generated on  : 13-Jul-2025 16:33:52
 */

/* Include Files */
#include "myMult.h"

/* Function Definitions */
/*
 * Arguments    : double a
 *                double b
 * Return Type  : double
 */
double myMult(double a, double b)
{
  return a * b;
}

/*
 * File trailer for myMult.c
 *
 * [EOF]
 */

参考

トピック