MATLAB コードからのスタンドアロン C/C++ 実行可能ファイルの生成
MATLAB Coder アプリを使用した C 実行可能ファイルの生成
この例では、MATLAB® Coder™ アプリを使用して MATLAB コードから C 実行可能ファイルを生成する方法を示します。この例では、ランダムなスカラー値を生成する MATLAB 関数の実行可能ファイルを生成します。アプリを使用して以下を行います。
生成されたライブラリ関数を呼び出す C の
main
関数の例を生成します。生成された
main.c
とmain.h
をコピーして変更します。変更された
main.c
およびmain.h
をアプリが検出できるようにプロジェクト設定を変更します。実行可能ファイルを生成します。
エントリポイント関数の作成
ローカルの書き込み可能なフォルダーで、開区間 (0,1) 上の標準一様分布からランダムなスカラー値を生成する MATLAB 関数 coderand
を作成します。
function r = coderand() %#codegen r = rand();
テスト ファイルの作成
同じローカルの書き込み可能なフォルダーで、coderand
を呼び出す MATLAB ファイル coderand_test.m
を作成します。
function y = coderand_test()
y = coderand();
MATLAB Coder アプリを開く
MATLAB ツールストリップの [アプリ] タブの [コード生成] の下で、MATLAB Coder アプリ アイコンをクリックします。
[ソース ファイルの選択] ページが開きます。
ソース ファイルの指定
[ソース ファイルの選択] ページで、エントリポイント関数の名前
coderand
を入力または選択します。現在のフォルダーに既定の名前
coderand.prj
をもつプロジェクトが作成されます。[次へ] をクリックして [入力の型を定義] ステップに進みます。アプリによって関数のコーディングの問題とコード生成の準備状態が解析されます。問題が検出された場合は、[コード生成の準備状態の確認] ページが開くので、ここで問題を確認して修正できます。この例では問題は検出されないので、[入力の型を定義] ページが表示されます。
入力の型の定義
C では静的なデータ型が使用されるため、MATLAB Coder は MATLAB ファイル内のすべての変数のプロパティをコンパイル時に判別しなければなりません。すべてのエントリポイント関数の入力のプロパティを指定しなければなりません。MATLAB Coder は、エントリポイント関数の入力のプロパティから MATLAB ファイル内のすべての変数のプロパティを推定できます。
この例では、関数 coderand
には入力はありません。
[次へ] をクリックして [実行時の問題の確認] ステップに進みます。
実行時の問題の確認
[実行時の問題の確認] ステップでは、エントリポイント関数からの MEX ファイルの生成、MEX 関数の実行および問題の報告が行われます。このステップはオプションです。ただし、このステップを実行することをお勧めします。生成された C コードでの診断が難しいランタイム エラーを検出して修正することができます。
[実行時の問題の確認] ダイアログ ボックスを開くために [問題の確認] 矢印
をクリックします。
テスト ファイル
coderand_test
を選択または入力します。[問題の確認] をクリックします。
アプリにより
coderand
の MEX 関数が生成されます。coderand
の呼び出しを MEX 関数の呼び出しに置き換えてテスト ファイルが実行されます。MEX 関数の生成または実行中に問題が検出された場合は、警告およびエラー メッセージが表示されます。これらのメッセージをクリックして問題のあるコードに移動し、問題を修正します。この例ではアプリは問題を検出しません。[次へ] をクリックして [コード生成] ステップに進みます。
C の main
関数の生成
実行可能ファイルを生成するときに、C/C++ の関数を指定しなければなりません。既定では、C/C++ のソース コード、スタティック ライブラリ、ダイナミック リンク ライブラリまたは実行可能ファイルを生成するときに、MATLAB Coder によって main
関数が生成されます。この生成された main 関数はテンプレートであり、アプリケーションに合わせて変更します。main 関数の例を使用した生成コードの組み込みを参照してください。生成された main 関数をコピーして変更した後で、これを使用して C/C++ の実行可能ファイルを生成できます。または、独自の main 関数を記述することもできます。
coderand
の実行可能ファイルを生成する前に、coderand
を呼び出す main
関数を生成します。
[生成] ダイアログ ボックスを開くために [生成] 矢印
をクリックします。
[生成] ダイアログ ボックスで [ビルド タイプ] を
[ソース コード]
に、[言語] を [C] に設定します。プロジェクトの他のビルド構成設定には既定値を使用します。[詳細設定] をクリックします。
[すべての設定] タブの [詳細設定] で、[main の例の生成] が
[main 関数の例を生成するが、コンパイルしない]
に設定されていることを確認します。[閉じる] をクリックします。[生成] をクリックします。
MATLAB Coder によって
main.c
ファイルとmain.h
ファイルが生成されます。コード生成に成功したことが示されます。[次へ] をクリックして [ワークフローの完了] ページを開きます。
[ワークフローの完了] ページの [生成された出力] で、
main.c
がサブフォルダーcoderand\codegen\lib\coderand\examples
にあることが示されます。
生成されたメイン ファイルの例のコピー
以降のコード生成では生成されたサンプル ファイルが上書きされる可能性があるため、これらのファイルを変更する前に codegen
フォルダーの外の書き込み可能なフォルダーにコピーします。この例では、main.c
と main.h
をサブフォルダー coderand\codegen\lib\coderand\examples
から書き込み可能なフォルダー (例: c:\myfiles
) にコピーします。
生成されたメイン ファイルの例の変更
メイン ファイルの例のコピーが含まれているフォルダーで、
main.c
を開きます。coderand
の呼び出しの結果を出力するようにmain.c
を変更します。main_coderand
で次の行を削除します。double r;
main_coderand
でを次に置き換えます。r = coderand()
printf("coderand=%g\n", coderand());
この例では
main
に引数はありません。main
で次の行を削除します。(void)argc; (void)argv;
main
の定義を次のように変更します。int main()
main.h
を開きます。main.h
を変更します。stdio
をインクルード ファイルに追加します。#include <stdio.h>
main の宣言を次のように変更します。
extern int main()
実行可能ファイルの生成
生成されたメイン ファイルの例を変更した後、前に作成したプロジェクト ファイルを開くか coderand.m
をアプリから選択します。プロジェクトを上書きするか、プロジェクトに別の名前を付けて両方のプロジェクト ファイルを保存するかを選択できます。
[コード生成] ページを開くために、ワークフロー ステップ
を展開して [生成] をクリックします。
[生成] ダイアログ ボックスを開くために [生成] 矢印
をクリックします。
[ビルド タイプ] を
[実行可能ファイル (.exe)]
に設定します。[詳細設定] をクリックします。
[カスタム コード] タブの [追加ソース ファイル] に
main.c
を入力します。[カスタム コード] タブの [追加インクルード ディレクトリ] に、変更した
main.c
ファイルとmain.h
ファイルの場所を入力します。たとえば、c:\myfiles
とします。[閉じる] をクリックします。実行可能ファイルを生成するために [生成] をクリックします。
コード生成に成功したことが示されます。
[次へ] をクリックして [ワークフローの完了] ステップに進みます。
[生成された出力] の下に、生成された実行可能ファイル
coderand.exe
の場所が表示されます。
実行可能ファイルの実行
Windows® プラットフォーム上の MATLAB で実行可能ファイルを実行するには、次のように入力します。
system('coderand')
メモ
この例の関数 coderand
の実行可能ファイルは 0 ~ 1 の固定値を返します。実行ごとに新しい値を生成するコードを生成するには、MATLAB コードで関数 RandStream
を使用します。
コマンド ラインでの C 実行可能ファイルの生成
この例では、ランダムなスカラー値を生成する MATLAB 関数と、その MATLAB 関数を呼び出す C の main 関数を作成します。それから、関数入力パラメーターの型を指定し、main 関数を指定し、MATLAB コードに対応する C 実行可能ファイルを生成します。
開区間 (0,1) 上の標準一様分布からランダムなスカラー値を生成する MATLAB 関数
coderand
を作成します。function r = coderand() %#codegen r = rand();
coderand
を呼び出す C の main 関数であるc:\myfiles\main.c
を記述します。以下に例を示します。/* ** main.c */ #include <stdio.h> #include <stdlib.h> #include "coderand.h" #include "coderand_terminate.h" int main() { /* The initialize function is called automatically from the generated entry-point function. So, a call to initialize is not included here. */ printf("coderand=%g\n", coderand()); coderand_terminate(); return 0; }
メモ
この例では、既定のファイル分割方法が MATLAB ファイルごとに 1 つのファイルを生成するようになっているため、
"coderand_terminate.h"
をインクルードします。すべての関数に対して 1 つのファイルを生成するようにファイルの分割方法を設定している場合は、"coderand_terminate.h"
をインクルードしないでください。C main 関数をインクルードするようにコード生成パラメーターを設定してから C 実行可能ファイルを生成します。
cfg = coder.config('exe'); cfg.CustomSource = 'main.c'; cfg.CustomInclude = 'c:\myfiles'; codegen -config cfg coderand
codegen
は現在のフォルダーに C 実行可能ファイルcoderand.exe
を生成します。サポート ファイルを既定のフォルダーcodegen/exe/coderand
に生成します。codegen
は、指定されたコード置換ライブラリが必要とする最低限の、ヘッダー ファイル用#include
ステートメントを生成します。
C/C++ 実行可能ファイルの main 関数の指定
実行可能ファイルを生成するには、main
関数を指定しなければなりません。C 実行可能ファイルについては、C ファイル main.c
を指定します。C++ 実行可能ファイルについては、C++ ファイル main.cpp
を指定します。main 関数を含むフォルダーに 1 つの メイン ファイルしかないことを確認してください。さもないと、main.c
が main.cpp
よりも優先され、C++ コードを生成する際にエラーが発生します。[プロジェクトの設定] ダイアログ ボックス、コマンド ラインまたは [コード生成] ダイアログ ボックスでメイン ファイルを指定できます。
既定では、C/C++ のソース コード、スタティック ライブラリ、ダイナミック リンク ライブラリまたは実行可能ファイルを生成するときに、MATLAB Coder によって main
関数が生成されます。この生成された main 関数はテンプレートであり、アプリケーションに合わせて変更します。main 関数の例を使用した生成コードの組み込みを参照してください。生成された main 関数をコピーして変更した後で、これを使用して C/C++ の実行可能ファイルを生成できます。または、独自の main 関数を記述することもできます。
MATLAB 関数を C/C++ ライブラリ関数または C/C++ 実行可能ファイルに変換すると、MATLAB Coder によって、初期化関数と終了関数が生成されます。
ファイルの分割方法が MATLAB ファイルごとに 1 つのファイルを生成するように設定されている場合は、
main.c
に初期化および終了ヘッダー関数をインクルードしなければなりません。それ以外の場合、main.c
にそれらを含めないでください。初期化関数および終了関数の呼び出しの詳細については、生成された初期化関数と終了関数の使用を参照してください。
main 関数の指定
MATLAB Coder アプリを使用した main 関数の指定
[生成] ダイアログ ボックスを開くために、[コード生成] ページの [生成] 矢印
をクリックします。
[詳細設定] をクリックします。
[カスタム コード] タブで次のように設定します。
[追加ソース ファイル] に、
main
関数を含む C/C++ ソース ファイルの名前を設定します。たとえば、main.c
とします。詳細は、C/C++ 実行可能ファイルの main 関数の指定を参照してください。[追加インクルード ディレクトリ] に
main.c
の場所を設定します。たとえば、c:\myfiles
とします。
コマンド ラインで main 関数の指定
コード生成構成オブジェクトのプロパティ、CustomSource
および CustomInclude
を設定します (構成オブジェクトの取り扱いを参照)。CustomInclude
プロパティは CustomSource
で指定された C/C++ ファイルの場所を示します。
実行可能ファイル用の構成オブジェクトの作成
cfg = coder.config('exe');
CustomSource
プロパティ にmain
関数を含む C/C++ ソース ファイルの名前を設定します。(詳細については、C/C++ 実行可能ファイルの main 関数の指定を参照) 次に例を示します。cfg.CustomSource = 'main.c';
CustomInclude
プロパティをmain.c
の場所に設定します。以下に例を示します。cfg.CustomInclude = 'c:\myfiles';
コマンド ライン オプションを使用して C/C++ 実行可能ファイルを生成します。たとえば、
myFunction
がdouble
型の入力パラメーターを 1 つ取る場合は以下のとおりです。codegen -config cfg myMFunction -args {0}
MATLAB Coder は main 関数をコンパイルし、
myMFunction.m
から生成した C/C++ コードにリンクします。