Main Content

C または C++ コンパイラの選択と設定

ビルド プロセスには、サポートされているコンパイラが必要。"コンパイラ" は、この文脈では、リンカーと make ユーティリティ、高水準言語のコンパイラを含む開発環境のことを意味します。サポートされているコンパイラのバージョンの詳細については、以下を参照してください。

実行可能プログラムを作成するとき、ビルド プロセスはサポートされているコンパイラにアクセスできなければなりません。ビルド プロセスは、既定の MEX コンパイラに基づいて、使用するコンパイラを見つけることができます。

ビルド プロセスではツールチェーンまたはテンプレート makefile の選択も要求されます。ツールチェーンまたはテンプレート makefile はビルドの make 段階で使用されるコンパイラを決定します。詳細については、ツールチェーン (ToolchainInfo) またはテンプレート makefile のビルド プロセスの設定を参照してください。

どのテンプレート makefile がコンパイラとシステム ターゲット ファイルで使用できるかを判定するには、製品間でのシステム ターゲット ファイルのサポートの比較を参照してください。

ビルド プロセスでは、生成したファイルもユーザーが指定したファイルも、ファイルの拡張子が .c.cpp かで C コンパイラを使うか C++ コンパイラを使うかが決まります。ファイルの拡張子が .c の場合、ビルド プロセスはそのファイルのコンパイルに C コンパイラを使用し、その記号は C 連結規則を使用します。ファイルの拡張子が .cpp の場合、ビルド プロセスはそのファイルのコンパイルに C++ コンパイラを使用し、その記号は C++ 連結指定を使用します。

言語規格への準拠

コード ジェネレーターは以下の規格に準拠するコードを生成します。

言語サポートする規格他の名前
C

ISO®/IEC 9899:1990

C89/C90

ISO/IEC 9899:1999

C99

C++

ISO/IEC 14882:2003

C++03

ISO/IEC 14882:2011

C++11

コード ジェネレーターが以下のソースから生成するコードは、ANSI® C/C++ に適合します。

  • Simulink® の組み込みアルゴリズム コード

  • 生成されるシステムレベルのコード (タスク ID [TID] チェック、管理、関数、その他)

  • その他のブロックセットからのコード (Fixed-Point Designer™ 製品、Communications Toolbox™ 製品など)

  • その他のコード ジェネレーター (MATLAB® 関数など) からのコード

また、コード ジェネレーターは次のコードを統合できます。

  • 組み込みのシステム ターゲット ファイル (たとえば、スタートアップ コード、デバイス ドライバー ブロック)

  • カスタム S-Function または TLC ファイル

メモ

この 2 つのソースのコーディング標準はコード ジェネレーターの制御範囲を越えています。そのため、これらの標準は、ANSI C、C89/C90 サブセット内でサポートされていない C99 機能をコードが使用するなど、適合性の問題の原因になる場合があります。

プログラミング言語の考慮事項

コード ジェネレーターは C および C++ コードを生成します。プログラミング言語を選択するときは、以下を検討してください。

  • プロジェクトでは、特定のコンパイラを使用するようにコード ジェネレーターを設定する必要があるか。Windows® で C/C++ コードを生成するには、この選択が必要です。

  • プロジェクトでは、モデルの既定の言語コンフィギュレーションを変更する必要があるか。C または C++ プログラミング言語の選択を参照してください。

  • プロジェクトでは、レガシ コードまたはカスタム コードを生成コードと統合する必要があるか。統合オプションの要約については、外部コード統合ワークフローの選択 (Embedded Coder)を参照してください。

  • プロジェクトでは、C および C++ コードを統合する必要があるか。統合する必要がある場合は、外部コード統合ワークフローの選択 (Embedded Coder)を参照してください。

    メモ

    生成したコードをカスタム コードと統合するとき C と C++ のコードを混在させることができます。ただし、そのとき注意しなければならないことは、C と既定の C++ の連結規則の違いと、必要に応じて extern "C" 連結指定子を追加することです。連結規則の違いの詳細と extern "C" の適用方法については、C++ プログラム言語の参考資料を参照してください。

  • プロジェクトでは、他の製品のコード生成サポートが必要か。C++ 言語サポートの制限事項を参照してください。

Stateflow® を使用した C++ コード生成の例については、sfcndemo_cppcount モデルまたは sf_cpp モデルを参照してください。

C++ 言語サポートの制限事項

[言語] コンフィギュレーション パラメーターを [C++] に設定しているが、[ツールチェーン] コンフィギュレーション パラメーターで C++ コンパイラを指定しない場合、コード生成でエラーが発生します。

コード ジェネレーターは、次の製品の C++ コードを生成しません。

Simscape™ Driveline™
Simscape Multibody™ First Generation (Simscape Multibody Second Generation はサポートされます)
Simscape Electrical™ Power Systems
Simulink Real-Time™

[コード インターフェイスのパッケージ化][再利用できない関数] に設定されている ERT および ERT ベースのシステム ターゲット ファイルの場合、現在、次のフィールドは .cpp 拡張子をサポートしません。

  • データ定義ファイル名

  • Simulink.Signal クラスまたは Simulink.Parameter クラス、もしくはそれらのサブクラスのオブジェクトであるデータ オブジェクトの [定義ファイル]

指定するファイル名に .c 拡張子があるか、あるいは拡張子がなく、コード生成言語に C++ を指定する場合は、コード ジェネレーターは .cpp ファイルを生成します。

コード ジェネレーターは符号付き整数オーバーフローのラップを想定

コード ジェネレーターは、符号付き整数 C の演算がオーバーフロー時にラップすると仮定して、メモリ使用量を低減し、生成されるコード実行を強化します。符号付き整数のオーバーフローは、算術演算の結果が出力データ型で表現可能な値の範囲外になると発生します。C プログラミング言語はこのような演算結果を定義しません。一部の C コンパイラは、オーバーフロー状態を引き起こしても、範囲内の値に対して符号付き演算をアグレッシブに最適化します。その他のコンパイラはオーバーフロー時にラップする動作全体を保持します。たとえば、gcc コンパイラと MinGW コンパイラは、符号付き整数のオーバーフロー時に確実にラップするオプションを用意しています。コンパイラによってオーバーフローの処理がさまざまであるため、モデルに生成されたプログラム イメージは、モデルのシミュレーション結果とは異なる結果を生成する可能性があります。

コードを生成するときに、コード ジェネレーターが設定する既定のオプションでサポートされているコンパイラを使用すると、コンパイラはオーバーフロー時にラップする動作全体を保持します。コンパイラ オプションを変更する場合または別の開発環境でコードをコンパイルする場合、コンパイラはオーバーフロー時にラップする動作全体を保持しない可能性があります。この場合、実行可能プログラムは予測できない結果を生成する可能性があります。

この問題がお使いのアプリケーションで懸念事項となる場合、次の 1 つ以上のアクションを検討してください。

  • コンパイルされたコードから予測どおりの結果が生成されることを検証する。

  • コンパイラがラップ動作を強制できる場合は、オンにする。たとえば、gcc コンパイラまたは gcc ベースのコンパイラ (MinGW など) の場合、コンパイラ オプション -fwrapv を使用するようにビルド プロセスを構成します。

  • 整数のオーバーフローでラップするコンパイラを選択する。

  • Embedded Coder がインストールされている場合、符号付き整数用に生成されたコードを置換するカスタムのコード置換ライブラリを開発して適用する。詳細については、コード置換のカスタマイズ (Embedded Coder)を参照してください。

コンパイラの選択と構成

インストールされたコンパイラを確認し、既定のコンパイラを選択するには、コマンド ウィンドウで以下を入力します。

mex -setup

Windows コンピューターでは、サポートされるコンパイラをインストールしたり、既定のコンパイラを選択したりできます。

UNIX® プラットフォームでは、既定のコンパイラは GNU® の場合は GNU gcc/g++Mac の場合は Xcode です。

ビルド アプローチ構成で特定のコンパイラが選択されない限り、コード ジェネレーターはビルド プロセスで既定のコンパイラを使用します。

コード ジェネレーターで必要となるコンパイラは主に、指定されたシステム ターゲット ファイルによって決まります。

  • [grt.tlc] (汎用リアルタイム ターゲット)、[ert.tlc] (Embedded Coder®) または [autosar.tlc] (AUTOSAR 用 Embedded Coder) などのツールチェーンベースのシステム ターゲット ファイルを選択すると、[ビルド プロセス] サブペインにビルド プロセスのためのコンフィギュレーション パラメーターが表示されます。[ツールチェーン] コンフィギュレーション パラメーターを使用して、モデルをビルドするコンパイラと関連ツールを選択します。選択したツールチェーンを検証するには、[ツールチェーンの検証] をクリックします。

  • rsim.tlc などのテンプレート makefile (TMF) ベースのシステム ターゲット ファイルを選択すると、[ビルド プロセス] サブペインにビルド プロセスを構成するためのテンプレート makefile パラメーターが表示されます。[テンプレート makefile] パラメーターは、選択されたシステム ターゲット ファイルの既定の TMF ファイルを表示します。システム ターゲット ファイルがコンパイラ固有のテンプレート makefile (たとえば、ラピッド シミュレーションまたは S-Function システム ターゲット ファイル) をサポートしている場合、[テンプレート makefile] をコンパイラ固有の TMF に設定できます。有効な TMF 名については、製品間でのシステム ターゲット ファイルのサポートの比較を参照してください。

生成されたコードが 2 GB の静的メモリ制限を超える場合、コンパイラ エラーが発生します。この問題を解決するには、以下を行います。

  • GRT ベースのシステム ターゲット ファイルの場合、モデル コンフィギュレーション パラメーター [コード インターフェイスのパッケージ化][再利用可能な関数] に設定します。

  • ERT ベースのシステム ターゲット ファイルの場合、モデル コンフィギュレーション パラメーター [コード インターフェイスのパッケージ化][再利用可能な関数] に設定し、パラメーター [モデルの初期化に動的メモリ割り当てを使用] を選択します。

S-Function ソース コードのインクルード

コード ジェネレーターが S-Function を含むモデルをビルドするとき、現在のフォルダーまたは S-Function の MEX ファイルと同じフォルダーに S-Function のソース コードを置くことができます。コード ジェネレーターは、sfncname.h という名前のファイルを S-Function MEX ファイルと同じフォルダー内で検出すると、生成された makefile へのインクルード パスを追加します。このフォルダーは、MATLAB パス上になければなりません。

同様に、コード ジェネレーターは、S-Function MEX ファイルが存在するフォルダー内で sfncname.c (または .cpp) ファイルを見つけると、そのフォルダーの規則を追加します。

関連するトピック

外部の Web サイト