Main Content

生成された複数の 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: View report

地球をモデル化する 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: View report

プロジェクト統合シナリオ: 惑星のモデル化

惑星のモデル化を実行し、落下する物体の飛行時間などの量を計算する、より大きなプロジェクトを設計するとします。飛行時間は、それぞれの惑星の重力定数と、物体の初期の高さによって異なります。この大きいプロジェクトの 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 と関連するビルド構成関数を使用して生成されたプロジェクトをより大きなプロジェクトに統合する方法を示しています。

function [t_m, t_e] = planetSim %#codegen
% Example function that integrates generated code projects with namespaces
d = 10; 
g = 0;

% Add #include statements for external function names
coder.cinclude('../projectMoon/getGravityConst.h');
coder.cinclude('../projectEarth/getGravityConst.h');

% Call external functions & do computations
g = coder.ceval('moon::getGravityConst');
t_m = timeToDrop(d,g);

g = coder.ceval('earth::getGravityConst');
t_e = timeToDrop(d,g);

function t = timeToDrop(d,g)
t = sqrt(2*d/(-g));

関数 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: View report

生成された 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

出力には、月で落下する物体の飛行時間と、地球で落下する物体の飛行時間が示されます。

参考

| | | | |

関連するトピック