Main Content

MATLAB コードからのスタンドアロン C/C++ 実行可能ファイルの生成

MATLAB Coder アプリを使用した C 実行可能ファイルの生成

この例では、MATLAB® Coder™ アプリを使用して MATLAB コードから C 実行可能ファイルを生成する方法を示します。この例では、ランダムなスカラー値を生成する MATLAB 関数の実行可能ファイルを生成します。アプリを使用して以下を行います。

  1. 生成されたライブラリ関数を呼び出す C の main 関数の例を生成します。

  2. 生成された main.cmain.h をコピーして変更します。

  3. 変更された main.c および main.h をアプリが検出できるようにプロジェクト設定を変更します。

  4. 実行可能ファイルを生成します。

エントリポイント関数の作成

ローカルの書き込み可能なフォルダーで、開区間 (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 アプリ アイコンをクリックします。

[ソース ファイルの選択] ページが開きます。

ソース ファイルの指定

  1. [ソース ファイルの選択] ページで、エントリポイント関数の名前 coderand を入力または選択します。

    現在のフォルダーに既定の名前 coderand.prj をもつプロジェクトが作成されます。

  2. [次へ] をクリックして [入力の型を定義] ステップに進みます。アプリによって関数のコーディングの問題とコード生成の準備状態が解析されます。問題が検出された場合は、[コード生成の準備状態の確認] ページが開くので、ここで問題を確認して修正できます。この例では問題は検出されないので、[入力の型を定義] ページが表示されます。

入力の型の定義

C では静的なデータ型が使用されるため、MATLAB Coder は MATLAB ファイル内のすべての変数のプロパティをコンパイル時に判別しなければなりません。すべてのエントリポイント関数の入力のプロパティを指定しなければなりません。MATLAB Coder は、エントリポイント関数の入力のプロパティから MATLAB ファイル内のすべての変数のプロパティを推定できます。

この例では、関数 coderand には入力はありません。

[次へ] をクリックして [実行時の問題の確認] ステップに進みます。

実行時の問題の確認

[実行時の問題の確認] ステップでは、エントリポイント関数からの MEX ファイルの生成、MEX 関数の実行および問題の報告が行われます。このステップはオプションです。ただし、このステップを実行することをお勧めします。生成された C コードでの診断が難しいランタイム エラーを検出して修正することができます。

  1. [実行時の問題の確認] ダイアログ ボックスを開くために [問題の確認] 矢印 をクリックします。

    テスト ファイル coderand_test を選択または入力します。

  2. [問題の確認] をクリックします。

    アプリにより coderand の MEX 関数が生成されます。coderand の呼び出しを MEX 関数の呼び出しに置き換えてテスト ファイルが実行されます。MEX 関数の生成または実行中に問題が検出された場合は、警告およびエラー メッセージが表示されます。これらのメッセージをクリックして問題のあるコードに移動し、問題を修正します。この例ではアプリは問題を検出しません。

  3. [次へ] をクリックして [コード生成] ステップに進みます。

C の main 関数の生成

実行可能ファイルを生成するときに、C/C++ の関数を指定しなければなりません。既定では、C/C++ のソース コード、スタティック ライブラリ、ダイナミック リンク ライブラリまたは実行可能ファイルを生成するときに、MATLAB Coder によって main 関数が生成されます。この生成された main 関数はテンプレートであり、アプリケーションに合わせて変更します。main 関数の例を使用した生成コードの組み込みを参照してください。生成された main 関数をコピーして変更した後で、これを使用して C/C++ の実行可能ファイルを生成できます。または、独自の main 関数を記述することもできます。

coderand の実行可能ファイルを生成する前に、coderand を呼び出す main 関数を生成します。

  1. [生成] ダイアログ ボックスを開くために [生成] 矢印 をクリックします。

  2. [生成] ダイアログ ボックスで [ビルド タイプ][ソース コード] に、[言語] を [C] に設定します。プロジェクトの他のビルド構成設定には既定値を使用します。

  3. [詳細設定] をクリックします。

  4. [すべての設定] タブの [詳細設定] で、[main の例の生成][main 関数の例を生成するが、コンパイルしない] に設定されていることを確認します。[閉じる] をクリックします。

  5. [生成] をクリックします。

    MATLAB Coder によって main.c ファイルと main.h ファイルが生成されます。コード生成に成功したことが示されます。

  6. [次へ] をクリックして [ワークフローの完了] ページを開きます。

    [ワークフローの完了] ページの [生成された出力] で、main.c がサブフォルダー coderand\codegen\lib\coderand\examples にあることが示されます。

生成されたメイン ファイルの例のコピー

以降のコード生成では生成されたサンプル ファイルが上書きされる可能性があるため、これらのファイルを変更する前に codegen フォルダーの外の書き込み可能なフォルダーにコピーします。この例では、main.cmain.h をサブフォルダー coderand\codegen\lib\coderand\examples から書き込み可能なフォルダー (例: c:\myfiles) にコピーします。

生成されたメイン ファイルの例の変更

  1. メイン ファイルの例のコピーが含まれているフォルダーで、main.c を開きます。

     生成された main.c

  2. 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.c

  3. main.h を開きます。

     生成された main.h

  4. main.h を変更します。

    • stdio をインクルード ファイルに追加します。

      #include <stdio.h>

    • main の宣言を次のように変更します。

      extern int main()

 変更された main.h

実行可能ファイルの生成

生成されたメイン ファイルの例を変更した後、前に作成したプロジェクト ファイルを開くか coderand.m をアプリから選択します。プロジェクトを上書きするか、プロジェクトに別の名前を付けて両方のプロジェクト ファイルを保存するかを選択できます。

  1. [コード生成] ページを開くために、ワークフロー ステップ を展開して [生成] をクリックします。

  2. [生成] ダイアログ ボックスを開くために [生成] 矢印 をクリックします。

  3. [ビルド タイプ][実行可能ファイル (.exe)] に設定します。

  4. [詳細設定] をクリックします。

  5. [カスタム コード] タブの [追加ソース ファイル]main.c を入力します。

  6. [カスタム コード] タブの [追加インクルード ディレクトリ] に、変更した main.c ファイルと main.h ファイルの場所を入力します。たとえば、c:\myfiles とします。[閉じる] をクリックします。

  7. 実行可能ファイルを生成するために [生成] をクリックします。

    コード生成に成功したことが示されます。

  8. [次へ] をクリックして [ワークフローの完了] ステップに進みます。

  9. [生成された出力] の下に、生成された実行可能ファイル coderand.exe の場所が表示されます。

実行可能ファイルの実行

Windows® プラットフォーム上の MATLAB で実行可能ファイルを実行するには、次のように入力します。

system('coderand')

メモ

この例の関数 coderand の実行可能ファイルは 0 ~ 1 の固定値を返します。実行ごとに新しい値を生成するコードを生成するには、MATLAB コードで関数 RandStream を使用します。

コマンド ラインでの C 実行可能ファイルの生成

この例では、ランダムなスカラー値を生成する MATLAB 関数と、その MATLAB 関数を呼び出す C の main 関数を作成します。それから、関数入力パラメーターの型を指定し、main 関数を指定し、MATLAB コードに対応する C 実行可能ファイルを生成します。

  1. 開区間 (0,1) 上の標準一様分布からランダムなスカラー値を生成する MATLAB 関数 coderand を作成します。

    function r = coderand() %#codegen
    r = rand();
  2. 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" をインクルードしないでください

  3. 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.cmain.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 関数の指定

  1. [生成] ダイアログ ボックスを開くために、[コード生成] ページの [生成] 矢印 をクリックします。

  2. [詳細設定] をクリックします。

  3. [カスタム コード] タブで次のように設定します。

    1. [追加ソース ファイル] に、main 関数を含む C/C++ ソース ファイルの名前を設定します。たとえば、main.c とします。詳細は、C/C++ 実行可能ファイルの main 関数の指定を参照してください。

    2. [追加インクルード ディレクトリ]main.c の場所を設定します。たとえば、c:\myfiles とします。

コマンド ラインで main 関数の指定

コード生成構成オブジェクトのプロパティ、CustomSource および CustomInclude を設定します (構成オブジェクトの取り扱いを参照)。CustomInclude プロパティは CustomSource で指定された C/C++ ファイルの場所を示します。

  1. 実行可能ファイル用の構成オブジェクトの作成

    cfg = coder.config('exe');
    
  2. CustomSource プロパティ に main 関数を含む C/C++ ソース ファイルの名前を設定します。(詳細については、C/C++ 実行可能ファイルの main 関数の指定を参照) 次に例を示します。

    cfg.CustomSource = 'main.c';

  3. CustomInclude プロパティを main.c の場所に設定します。以下に例を示します。

    cfg.CustomInclude = 'c:\myfiles';

  4. コマンド ライン オプションを使用して C/C++ 実行可能ファイルを生成します。たとえば、myFunctiondouble 型の入力パラメーターを 1 つ取る場合は以下のとおりです。

    codegen -config cfg  myMFunction -args {0}

    MATLAB Coder は main 関数をコンパイルし、myMFunction.m から生成した C/C++ コードにリンクします。