生成された複数の C++ コード プロジェクトの統合
この例では、異なる 2 つの生成された C++ コード プロジェクトを、より大きい単一のプロジェクトに統合する方法を説明します。
生成されたコード プロジェクトは、関数名が類似していても、設定、パラメーター、または機能が異なる可能性があります。名前空間でコードを生成して、同じ名前を共有する異なるプロジェクトの統合に役立てます。名前空間は、コードの可読性も向上させることができます。
MATLAB® アルゴリズムの C++ コードの生成
重力定数を返す単純な MATLAB 関数について考えます。重力定数の値はグローバル変数から派生します。
type getGravityConst.m
function c = getGravityConst %#codegen global g c = g;
月と地球についてのシナリオをモデル化する getGravityConst
のコードを生成するとします。同じエントリポイント関数をもつ 2 つの個別のコード プロジェクトを生成します。それぞれのプロジェクトについて、異なるグローバル値、およびそれに伴う重力定数を指定します。
コード生成構成オブジェクトを作成します。次を指定します。
DLL ビルド タイプ。
C++ ターゲット言語。
名前空間としての軌道天体の名前。
#pragma once
スタイルの#include
ガード。関数
packNGo
を呼び出しての、生成されたコード ファイルの.zip
ファイルへのパッケージ化。
cfg = coder.config('dll'); cfg.TargetLang = "C++"; cfg.CppNamespace = 'moon'; cfg.HeaderGuardStyle = "UsePragmaOnce"; cfg.PostCodeGenCommand = 'packNGo(buildInfo)';
月をモデル化するため、次の条件で getGravityConst
のコードを生成します。
以前に定義した構成オブジェクトを使用して。
コード生成レポートを使用して。
コードが月の重力定数の値を m/s^2 の単位で返すように。
projectMoon
という出力フォルダーに。getGravityConstMoon
という出力バイナリを使用して。
codegen getGravityConst -config cfg -report -globals {'g', -1.62} ... -d projectMoon -o getGravityConstMoon
Code generation successful: To view the report, open('projectMoon/html/report.mldatx')
地球をモデル化する getGravityConst
のコードを生成するには、まず次の変更を行います。
名前空間名
重力定数
出力ファイル名
出力フォルダー名
cfg = coder.config('dll'); cfg.TargetLang = "C++"; cfg.CppNamespace = 'earth'; cfg.HeaderGuardStyle = "UsePragmaOnce"; cfg.PostCodeGenCommand = 'packNGo(buildInfo)'; codegen getGravityConst -config cfg -report -globals {'g', -9.81} ... -d projectEarth -o getGravityConstEarth
Code generation successful: To view the report, open('projectEarth/html/report.mldatx')
プロジェクト統合シナリオ: 惑星のモデル化
惑星のモデル化を実行し、落下する物体の飛行時間などの量を計算する、より大きなプロジェクトを設計するとします。飛行時間は、それぞれの惑星の重力定数と、物体の初期の高さによって異なります。この大きいプロジェクトの getGravityConst
のために生成されたコード関数を使用するとします。
プラットフォーム依存のファイル拡張子の決定
生成されたダイナミック ライブラリは、異なるプラットフォームでは異なる拡張子をもちます。このコードは、プラットフォームのための正しい拡張子を判別します。
dllext = ''; libext = ''; if ismac dllext = '.dylib'; libext = dllext; elseif isunix dllext = '.so'; libext = dllext; elseif ispc dllext = '.dll'; libext = '.lib'; else disp('Platform not supported') return end
生成されたコード プロジェクトを使用する main ファイルの記述
一般的なケースでは、プロジェクトのそれぞれの関数を呼び出す main ファイルを記述または変更して、さまざまなプロジェクトを統合します。名前空間を使用することで、関数の名前が同じであっても、それぞれのプロジェクトで生成された関数を区別することができます。
両方のプロジェクトで生成された C++ コードを使用する main ファイルを記述する方法の例については、添付ファイル main_planetSim.cpp
を参照してください。その main ファイルから実行可能ファイルまたはバイナリをビルドするには、ビルド ツール (コンパイラ、リンカー、および/または IDE) に、次のものとその正しいパスを指定または入力しなければなりません。
呼び出される任意の関数のヘッダー ファイル。
Winows プラットフォームではインポート ライブラリ (
.lib
ファイル)。ダイナミック ライブラリ (
.dll
ファイル、.so
ファイルおよび.dylib
ファイル)。他の生成されたソースとインクルード ファイルのためのインクルード ディレクトリ。
packNGo
コマンドがコード生成中に作成する .zip
ファイルには、生成されたコード ファイルが含まれます。zip ファイルをビルド ディレクトリまたはビルド環境のフォルダーに解凍します。また、ダイナミック ライブラリを実行可能ファイルからアクセスできるようにしなければなりません。たとえば、生成されたダイナミック ライブラリを実行可能ファイルと同じフォルダーに移動するなどです。
2 つのプロジェクトを統合する MATLAB 関数の記述
main ファイルを手作業で記述する代わりに、関数 coder.ceval
を使用して、2 つのプロジェクトを第 3 の生成されたコード プロジェクトに統合することもできます。関数 coder.ceval
によって、生成された C/C++ コードから外部の C/C++ コードを呼び出すことができます。
ファイル planetSim.m
で、coder.ceval
と関連するビルド構成関数を使用して生成されたプロジェクトをより大きなプロジェクトに統合する方法を示しています。
<include>planetSim.m</include>
関数 planetSim
の MEX コードを生成します。
linkObjectMoon = ['projectMoon/getGravityConstMoon' libext]; linkObjectEarth = ['projectEarth/getGravityConstEarth' libext]; cfg = coder.config('mex'); cfg.TargetLang = "C++"; codegen('planetSim','-config',cfg,'-d','planetSim','-report',linkObjectMoon,linkObjectEarth)
Code generation successful: To view the report, open('planetSim/html/report.mldatx')
生成された MEX 関数のテスト
MEX 関数を使用して、生成されたコードを MATLAB 環境でテストします。MEX 関数は生成されたリンク ライブラリにアクセスできなければなりません。リンク ライブラリを現在のディレクトリに移動し、MEX 関数を呼び出します。
copyfile(['projectMoon/getGravityConstMoon' dllext]); copyfile(['projectEarth/getGravityConstEarth' dllext]); [t_m, t_e] = planetSim_mex
t_m = 3.5136
t_e = 1.4278
出力には、月で落下する物体の飛行時間と、地球で落下する物体の飛行時間が示されます。
参考
coder.config
| codegen
| coder.cinclude
| coder.ceval
| packNGo
| coder.CodeConfig