メインコンテンツ

生成コードの分割についての理解と制御

既定では、コード ジェネレーターは生成コードを MATLAB® ファイル構造に一致するように分割します。この 1 対 1 のマッピングにより、生成された C/C++ ファイルと MATLAB コードを容易に関連付けることができます。または、すべての C/C++ 関数を単一のファイル内に生成することを選択できます。このオプションを指定すると、コードと既存の組み込みソフトウェアの統合が容易になります。

分割法の制御

生成される C/C++ コードの分割は、ファイルの分割方法の選択とインライン化の設定に依存します。ファイルの分割方法を設定するには、構成パラメーター [生成されたファイルの分割法] を次のいずれかに設定します。

  • MATLAB 関数ごとに 1 つの C/C++ ファイルを生成するには、パラメーターを [MATLAB ファイルごとに 1 つのファイルを生成] に設定します。

  • MATLAB コードに対して単一の C/C++ ファイルを生成するには、パラメーターを [すべての関数を 1 つのファイルに生成] に設定します。

ただし、インライン化を無効にしないと、[生成されたファイルの分割法][MATLAB ファイルごとに 1 つのファイルを生成] に設定しても、一部の MATLAB 関数がコード ジェネレーターでインライン化されることがあります。最上位の各 MATLAB 関数に対して 1 つの C/C++ ファイルをコード ジェネレーターで強制的に生成するには、インライン化も無効にしなければなりません。インライン化の制御の詳細については、生成コードのパフォーマンスと可読性を微調整するためのインライン化の制御を参照してください。

MATLAB ファイルごとに 1 つの C/C++ ファイルに生成ファイルを分割する

既定では、インライン化されていない MATLAB 関数の場合、コード ジェネレーターは各 MATLAB ファイルに対して 1 つの C/C++ ファイルを生成します。この場合、MATLAB Coder™ は、生成された C/C++ コードを MATLAB ファイルに対応するように分割します。

エントリポイント関数の分割

各エントリポイント関数について、コード ジェネレーターは、C/C++ ソース、ヘッダー、およびオブジェクトのファイルを 1 ファイルで生成し、MATLAB ファイルと同じ名前を付けます。

たとえば、関数 identity を呼び出す簡単な関数 foo を定義するとします。coder.inline を使用して、identity 関数をインライン化しないようにコード ジェネレーターに指示します。

function y = foo(u,v) %#codegen
s = single(u);
d = double(v);
y = double(identity(s))+identity(d);
end
function y = identity(u) %#codegen
coder.inline("never")
y = u;
end

コマンド ラインで、-config:lib オプションを使用してスタティック ライブラリのビルドを指定し、-args オプションを使用して入力引数 uv を double のスカラーとして指定します。-c オプションを使用してソース コードのみを生成します。

codegen -config:lib foo -c -args {0 0}

あるいは、MATLAB Coder アプリを使用する場合は、foo をエントリポイント関数として追加し、uv を double のスカラーとして指定します。ツールストリップの [MATLAB Coder] タブで、[ビルド タイプ]、[スタティック ライブラリ (.lib)] をクリックしてビルド タイプを設定します。その後、[コード生成] ボタンをクリックしてコードを生成します。

コード ジェネレーターは、フォルダー codegen/lib/foofooidentity の以下のソース ファイルとヘッダー ファイルを生成します。

  • foo.c

  • foo.h

  • identity.c

  • identity.h

ローカル関数の分割

各ローカル関数について、コード ジェネレーターは呼び出し元の関数と同じ C/C++ ファイル内にコードを生成します。この分割パターンにはインライン化の設定は影響しません。

たとえば、ローカル関数 identity_local を呼び出す関数 bar を定義するとします。coder.inline("never") を使用して、identity_local をインライン化しないようにコード ジェネレーターに指示します。

function y = bar(u,v) %#codegen
s = single(u);
d = double(v);
y = double(identity_local(s))+identity_local(d);
end

function y = identity_local(u)
coder.inline("never")
y = u;
end

コマンド ラインで、-config:lib オプションを使用してスタティック ライブラリのビルドを指定し、-args オプションを使用して入力引数 uv を double のスカラーとして指定します。

codegen -config:lib bar -args {0 0}

あるいは、MATLAB Coder アプリを使用する場合は、bar をエントリポイント関数として追加し、uv を double のスカラーとして指定します。ツールストリップの [MATLAB Coder] タブで、[ビルド タイプ]、[スタティック ライブラリ (.lib)] をクリックしてビルド タイプを設定します。その後、[コード生成] ボタンをクリックしてコードを生成します。

コード ジェネレーターは、フォルダー codegen/lib/barbar のソース ファイルとヘッダー ファイルを生成しますが、identity_local については生成しません。

  • bar.c

  • bar.h

生成ファイルと場所

生成ファイルのタイプと場所は、指定するビルド タイプに依存します。コード ジェネレーターは、同じエントリ ポイントに対して同じタイプのビルドを生成するたびに、以前のビルドのファイルを削除します。新しいビルドでファイルが書き換えられないようにする場合は、ファイルを別の場所にコピーしてからビルドを開始します。

既定では、生成ファイルの名前と場所は、エントリ ポイントの名前とビルド タイプによって決まります。次の表は、エントリポイント関数 myFun のコードを生成する場合の生成ファイルの既定の名前と場所を示したものです。

ファイルのタイプ場所ファイル名
プラットフォーム固有の MEX ファイル現在のフォルダーmyFun_mex
C/C++ ソース、ヘッダーおよびオブジェクト ファイル

codegen/build type/myFun

build type は以下のいずれかです。

  • mex (MEX 関数用)

  • exe (C/C++ 実行可能ファイル用)

  • lib (C/C++ ライブラリ用)

  • dll (C/C++ ダイナミック ライブラリ用)

生成ファイルの名前の先頭はエントリポイント関数の名前になります。以下に例を示します。

  • myFun.c

  • myFun.cpp

  • myFun.h

  • myFun.c

  • myFun_data.c

コード生成レポート (生成する場合)

codegen/build type/myFun

report.mlxdata

生成ファイルのベース名を変更するには、次のいずれかの方法を使用します。

  • ツールストリップの [MATLAB Coder] タブで [設定] をクリックします。[カスタム出力ファイル] ボックスでベース名を指定します。

  • コマンド ラインで -o オプションを指定して codegen コマンドを使用します。

生成ファイルの場所を変更するには、次のいずれかの方法を使用します。

  • ツールストリップの [MATLAB Coder] タブで [設定]、[すべての設定を表示] をクリックします。コード構成ダイアログ ボックスの [出力] ペインにある [パス] セクションでビルド フォルダーを選択します。

  • コマンド ラインで -d オプションを指定して codegen コマンドを使用します。

参考

| |

トピック