主要内容

このペ,ジの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

生成コドを共有ラブラリとしてパッケジ化

嵌入式编码器®のライセンスがある場合は,モデルコンポーネントから生成されたソースコードをパッケージ化して配布を容易にし,コードを窗口®ダ▪▪ナミックリンクラ▪▪ブラリ(. dll), unix®共有オブジェクト(所以),またはMacintosh OS Xダ▪▪ナミックラ▪▪ブラリ(. dylib)の共有ラaapl . aapl .ブラリとしてビルドして,共有して使用することができます。自分自身または他のユ,ザ,が,Windows, UNIXまたはMacintosh OS X開発用コンピュタで実行されるアプリケションに共有ラブラリを統合できます。生成された. dll所以,または. dylibファイルはさまざまなアプリケーション間で共有可能で,そのファイルを使用するアプリケーションを再コンパイルせずにアップグレードできます。

生成された共有ラ▪▪▪ブラリに▪▪▪いて

システムタゲットファルert_shrlib.tlcを使用するようにコドジェネレタを設定して,共有ラブラリをビルドします。システムタゲットファルのコド生成では次をエクスポトします。

  • デ,タとしてのExportedGlobal型の変数と信号

  • デタとしてのリアルタムモデル構造体(模型_M

  • モデルコ,ドを実行するために必要な関数

生成された共有ラesc escブラリに含まれるシンボルのリストを表示するには,次のようにします。

  • Windowsでは,依赖步行者ユ,ティリティ(https://www.dependencywalker.comからダウンロド可能)を使用します。

  • Unixでは,nm - d模型所以を使用します。

  • Macintosh OS Xでは,nm - g模型. dylibを使用します。

共有ラesc escブラリを生成および使用するには,次のようにします。

  1. モデルコドの共有ラブラリバジョンを生成します。

  2. 共有ラブラリファルを読み込んで使用するアプリケションコドを作成します。

モデルコドの共有ラブラリバジョンの生成

モデルコドの共有ラブラリバジョンを生成します。

  1. モデルを開き,ert_shrlib.tlcシステムタゲットファルを使用するように構成します。

    ert_shrlib.tlcシステムターゲットファイルを選択すると,ビルドプロセスでモデルコードの共有ライブラリバージョンが現在の作業フォルダーに生成されます。この選択によって,コ,ドジェネレ,タ,がモデルに対して生成するコ,ドは変更されません。

  2. モデルを作成します。

  3. ビルドが完了したら,モデルサブフォルダ,の生成コ,ドを確認し,現在のフォルダ,の. dll所以,または. dylibファ@ @ルを確認します。

共有ラブラリを使用するアプリケションコドの作成

アプリケーションコードで共有ライブラリファイルを読み込み,その関数とデータにアクセスする方法の例を示すために,MathWorksはモデルrtwdemo_shrlibを提供しています。

メモ

rtwdemo_shrlibスクリプトを実行する前に,書き込み可能な作業フォルダ,に移動します。

モデルで,青いボタンをクリックしてスクリプトを実行します。スクリプトは以下を実行します。

  1. モデルから共有ラWindows上の. exe(64ビットのWindows上の. exe)rtwdemo_shrlib_win64.dllなど)をビルドします。

  2. 共有ラ@ @ブラリファ@ @ルを読み込んで使用するサンプルアプリケ@ @ションrtwdemo_shrlib_appをコンパ@ @ルしてリンクします。

  3. サンプルアプリケ,ションを実行します。

ヒント

移植性のために,明示的なリンクが推奨されます。ただし,Windowsシステムでは,暗黙のリンクをサポ,トするためにert_shrlibシステムタゲットファルで. libファesc escルが生成されて,保持されます。

暗黙のリンクを使用するには,生成されたヘッダーファイルを少しだけ変更して,生成されたCファイルで使用できるようにする必要があります。たとえば,Visual c++®を使用する場合は,共有ラ使用__declspec (dllimport)を宣言します。

このモデルでは次のサンプルアプリケションファルを使用します。これらのファルはフォルダmatlabroot/工具箱/ rtw / rtwdemos / shrlib_demo開く)にあります。

ファereplicationル 説明
rtwdemo_shrlib_app.h サンプルアプリケションのヘッダファル
rtwdemo_shrlib_app.c モデル用に生成された共有ラ@ @ブラリファ@ @ルを読み込んで使用するサンプルアプリケ@ @ション
run_rtwdemo_shrlib_app.m サンプルアプリケションをコンパル,リンク,および実行するスクリプト

モデルウィンドウで白いボタンをクリックして,これらの各ファ。さらに,スクリプトを実行すると,関連するソースファイルおよび生成コードファイルが現在のフォルダーに配置されます。ファereplicationルは、独自の ERT 共有ライブラリ ファイルのアプリケーション コードを記述するためのテンプレートとして使用できます。

以下の節では,サンプルアプリケ,ションファ,ルの主要な抜粋を示します。

サンプルアプリケションのヘッダファル

サンプルアプリケションのヘッダファルrtwdemo_shrlib_app.hには,モデルの外部入力と出力の型宣言が含まれます。

#ifndef _APP_MAIN_HEADER_ #define _APP_MAIN_HEADER_ typedef struct {int32_T Input;} ExternalInputs_rtwdemo_shrlib;typedef struct {int32_T输出;} ExternalOutputs_rtwdemo_shrlib;# endif / * _APP_MAIN_HEADER_ * /

サンプルアプリケションのcコド

サンプルアプリケ,ションのrtwdemo_shrlib_app.cには,共有ラ@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @プラットフォームに応じて,コードはWindowsまたはUNIXのライブラリコマンドを呼び出します。

#if (defined(_WIN32)||defined(_WIN64)) /* WINDOWS */ #include < WINDOWS .h> #define GETSYMBOLADDR GetProcAddress #define LOADLIB LoadLibrary #define CLOSELIB FreeLibrary #else /* UNIX */ #include  #define GETSYMBOLADDR dlsym #define LOADLIB dlopen #define CLOSELIB dlclose #endif int main() {void* handleLib;...#if defined(_WIN64) handllibb = LOADLIB("./rtwdemo_shrlib_win64.dll");#else #if defined(_WIN32) handleLib = LOADLIB("./rtwdemo_shrlib_win32.dll");#else /* UNIX */ handllib = LOADLIB("./rtwdemo_shrlib. "所以“RTLD_LAZY);#endif #endif…返回(CLOSELIB (handleLib));}

以下のコードの抜粋は,Cアプリケーションでモデルのエクスポートされたデータと関数にアクセスする方法を示しています。ユーザー定義の初期化コード,ステップコード,および終了コードを追加するためのフックに注目してください。

int32_T我;...空白(* mdl_initialize) (boolean_T);空白(* mdl_step)(空白);空白(* mdl_terminate)(空白);ExternalInputs_rtwdemo_shrlib (* mdl_Uptr);ExternalOutputs_rtwdemo_shrlib (* mdl_Yptr);uint8_T (* sum_outptr);...#if (defined(LCCDLL)||defined(BORLANDCDLL)) /*当DLL与LCC或BORLANDC链接时,导出的符号包含前导下划线*/ mdl_initialize =(void(*)(boolean_T))GETSYMBOLADDR(handleLib, "_rtwdemo_shrlib_initialize"); mdl_step =(void(*)(void))GETSYMBOLADDR(handleLib , "_rtwdemo_shrlib_step"); mdl_terminate =(void(*)(void))GETSYMBOLADDR(handleLib , "_rtwdemo_shrlib_terminate"); mdl_Uptr =(ExternalInputs_rtwdemo_shrlib*)GETSYMBOLADDR(handleLib , "_rtwdemo_shrlib_U"); mdl_Yptr =(ExternalOutputs_rtwdemo_shrlib*)GETSYMBOLADDR(handleLib , "_rtwdemo_shrlib_Y"); sum_outptr =(uint8_T*)GETSYMBOLADDR(handleLib , "_sum_out"); #else mdl_initialize =(void(*)(boolean_T))GETSYMBOLADDR(handleLib , "rtwdemo_shrlib_initialize"); mdl_step =(void(*)(void))GETSYMBOLADDR(handleLib , "rtwdemo_shrlib_step"); mdl_terminate =(void(*)(void))GETSYMBOLADDR(handleLib , "rtwdemo_shrlib_terminate"); mdl_Uptr =(ExternalInputs_rtwdemo_shrlib*)GETSYMBOLADDR(handleLib , "rtwdemo_shrlib_U"); mdl_Yptr =(ExternalOutputs_rtwdemo_shrlib*)GETSYMBOLADDR(handleLib , "rtwdemo_shrlib_Y"); sum_outptr =(uint8_T*)GETSYMBOLADDR(handleLib , "sum_out"); #endif if ((mdl_initialize && mdl_step && mdl_terminate && mdl_Uptr && mdl_Yptr && sum_outptr)) { /* === user application initialization function === */ mdl_initialize(1); /* insert other user defined application initialization code here */ /* === user application step function === */ for(i=0;i<=12;i++){ mdl_Uptr->Input = i; mdl_step(); printf("Counter out(sum_out): %d\tAmplifier in(Input): %d\tout(Output): %d\n", *sum_outptr, i, mdl_Yptr->Output); /* insert other user defined application step function code here */ } /* === user application terminate function === */ mdl_terminate(); /* insert other user defined application termination code here */ } else { printf("Cannot locate the specified reference(s) in the shared library.\n"); return(-1); }

サンプルアプリケ,ションのスクリプト

アプリケ,ションスクリプトrun_rtwdemo_shrlib_appはモデルを読み込んでリビルドした後に,モデルの共有ライブラリターゲットファイルをコンパイル,リンク,および実行します。rtwdemo_shrlibを開き,白いボタンをクリックしてソースコードを表示して,スクリプトソースファイルを表示できます。スクリプトで,開発環境に適用される可能性のあるコンパイル,リンク,および実行用のプラットフォーム依存コマンドの文字ベクトルを構成します。スクリプトを実行するには,青いボタンをクリックします。

メモ

rtwdemo_shrlibモデルを最初に開かずにrun_rtwdemo_shrlib_appスクリプトを実行するには,書き込み可能な作業フォルダ,に移動し,以下のmatlab®コマンドを発行します。

目录(fullfile (matlabroot,“工具箱”,“环球套票”、“rtwdemos”,“shrlib_demo”))

メモ

1の行で終了関数を2回呼び出すのは無効です。終了関数はポンタをクリアし,それらをnullに設定します。関数を 2 回目に呼び出すと NULL ポインターが逆参照され、プログラム エラーになります。

共有ラ@ @ブラリの制限

共有ラesc escブラリのビルドには,次のような制限が適用されます。

  • ert_shrlib.tlcシステムタゲットファルのコド生成では,次のものをデタとしてエクスポトします。

    • ExportedGlobal型の変数と信号

    • リアルタescムモデル構造体(模型_M

  • 函数调用子系统を含むモデルでは,ert_shrlib.tlcシステムターゲットファイルのコード生成で,初期化エントリポイント関数と終了エントリポイント関数に関連付けられたシンボルのみが共有ライブラリにエクスポートされます。

  • ert_shrlib.tlcシステムターゲットファイルのコード生成では,C言語のみがサポートされています(c++ではない)。ert_shrlib.tlcを選択すると,モデルコンフィギュレ,ションパラメ,タ,の[言語]はグレ,表示になります。

  • 生成された共有ライブラリを使用してモデルシミュレーションを再構成するには,アプリケーションの作成者は,システムと元のアプリケーションの共有ライブラリ関数呼び出しの間でタイミングを維持しなければなりません。シミュレション結果と統合結果を比較できるように,タミングは一貫していなければなりません。モデルコンフィギュレ,ションパラメ,タ,の[サポ,ト:連続時間][1 emfの出力/更新関数]を有効にするモデルから共有ライブラリを生成している場合,シミュレーションに関するさらなる考慮事項が適用されます。詳細にいては,1の出力/更新関数依存関係を参照してください。

関連するトピック