Main Content

C++ MATLAB データ API 共有ライブラリの生成と C++ アプリケーションのビルド

サポートされるプラットフォーム: Windows®、Linux®Mac

この例では、MATLAB® 関数から C++ 共有ライブラリを作成する方法を説明します。生成されたライブラリは、C++ アプリケーションに統合できます。また、この例では、C++ アプリケーションから C++ 共有ライブラリを呼び出す方法も示します。このアプリケーションを実行するために、MATLAB のライセンス コピーがターゲット システムにインストールされている必要はありません。

MATLAB での関数の作成

MATLAB で、パッケージ化する MATLAB コードを調べます。この例では、matlabroot\extern\examples\compilersdk\c_cpp\matrix にある addmatrix.m を開きます。

 addmatrix.m

MATLAB コマンド プロンプトに以下を入力します。

addmatrix([1 4 7; 2 5 8; 3 6 9], [1 4 7; 2 5 8; 3 6 9])

出力は以下のようになります。

 ans =
     2     8    14
     4    10    16
     6    12    18

ライブラリ コンパイラ アプリを使用した C++ 共有ライブラリの作成

  1. [MATLAB アプリ] タブで、[アプリ] セクションの右端にある矢印をクリックします。[アプリケーションのデプロイ] で、[ライブラリ コンパイラ] をクリックします。

    または、MATLAB コマンド プロンプトで以下を入力して、[ライブラリ コンパイラ] アプリを開きます。

    libraryCompiler

  2. ツールストリップの [タイプ] セクションで、[C++ 共有ライブラリ] をクリックします。

    ライブラリ コンパイラ アプリのプロジェクト ウィンドウで、デプロイする MATLAB アプリケーションのファイルを指定します。

    1. ツールストリップの [エクスポートする関数] セクションで、Add exported function to the project をクリックします。

    2. [ファイルの追加] ウィンドウで、サンプルのフォルダーを参照し、パッケージ化する関数を選択します。[開く] をクリックします。

    エクスポートする関数ファイルのリストに関数が追加されます。同じアプリケーションに複数のファイルをパッケージ化するには、この手順を繰り返します。

    この例では、matlabroot\extern\examples\compilersdk\c_cpp\matrix に移動して addmatrix.m を選択します。

  3. ツールストリップの [パッケージ化オプション] セクションで次のオプションのいずれかを選択して、生成されるアプリケーションに MATLAB Runtime インストーラーを含めるかどうかを決定します。

    • ランタイムを Web からダウンロードMATLAB Runtime をダウンロードしてデプロイされた MATLAB アプリケーションと共にインストールするインストーラーを生成します。インストーラーのファイル名を指定できます。

    • ランタイムをパッケージに含めるMATLAB Runtime インストーラーを含むアプリケーションを生成します。インストーラーのファイル名を指定できます。

      メモ

      このオプションを初めて選択したときに、MATLAB Runtime インストーラーをダウンロードするように求めるメッセージが表示されます。

共有ライブラリ設定の指定

  1. [ライブラリ名] フィールドに、パッケージ化された共有ライブラリの名前として addmatrix が自動的に入力されます。この名前を libmatrix に変更します。同じ名前が、共有ライブラリの実装時にも使用されます。

  2. [サンプル] セクションで、[新規サンプルの作成] を選択して addmatrix.m をクリックします。

    開いた MATLAB ファイルで、a1 を非ゼロの値に初期化するようにコードを編集します。

    a1 = [1 4 7; 2 5 8; 3 6 9]; % Initialize a1 here
    a2 = a1; % Initialize a2 here
    a = addmatrix(a1, a2);

    ファイルを保存して、[ライブラリ コンパイラ] アプリに戻ります。詳細と制限については、サンプル ドライバー ファイルの作成を参照してください。

  3. 生成される C++ 共有ライブラリの API の種類を選択します。下部の [API の選択] セクションで、[MATLAB データ API を使用するインターフェイスの作成] を選択します。詳細については、C++ 共有ライブラリの API の選択を参照してください。

アプリケーションとその外観のカスタマイズ

ライブラリ コンパイラ アプリでは、インストーラーをカスタマイズし、アプリケーションをカスタマイズし、アプリケーションについて情報を追加することができます。

  • ライブラリ情報 — デプロイされるアプリケーションに関する情報。また、アプリケーション アイコンとスプラッシュ スクリーンを変更して、アプリケーションの外観をカスタマイズすることもできます。生成されるインストーラーはこの情報を使用して、インストールされるアプリケーションのメタデータを入力します。インストーラーのカスタマイズを参照してください。

  • 追加インストーラー オプション — 生成されるインストーラーの既定のインストール パスと、カスタム ロゴの選択。インストール パスの変更を参照してください。

  • ライブラリの実行に必要なファイル — 生成されるアプリケーションを実行するために必要な追加ファイル。これらのファイルは、生成されるアプリケーション インストーラーに含められます。コンパイラ プロジェクトの必須ファイルの管理を参照してください。

  • エンド ユーザー用にインストールされるファイル — アプリケーションと共にインストールされるファイル。

    アプリケーションと共にインストールするファイルの指定を参照してください。

アプリケーションのパッケージ化

パッケージ化オプションの選択が終了したら、ライブラリ コンパイラのプロジェクトを保存し、パッケージ化されたアプリケーションを生成します。

  1. [パッケージ化] をクリックします。

    [プロジェクトを保存] ダイアログ ボックスで、プロジェクトを保存する場所を指定します。

  2. [パッケージ] ダイアログ ボックスで、[プロセスが完了したら出力フォルダーを開く] が選択されていることを確認します。

    パッケージ化プロセスが完了したら、ターゲット フォルダー内の生成された出力を調べます。

    • 3 つのフォルダー for_redistributionfor_redistribution_files_only、および for_testing が生成されます。

      これらのフォルダーに生成されるファイルの詳細については、MATLAB 関数のパッケージ化後に生成されるファイルを参照してください。

    • ログ ファイル PackagingLog.html にはパッケージ化の結果が含まれています。

compiler.build.cppSharedLibrary を使用した C++ 共有ライブラリの作成

ライブラリ コンパイラ アプリの代わりに、プログラムによる方法を使用して C++ 共有ライブラリを作成できます。ライブラリ コンパイラを使用してライブラリを既に作成している場合は、C++ MATLAB データ API 共有ライブラリをサンプル アプリケーションとともに実装を参照してください。

  1. matlabroot\extern\examples\compilersdk\c_cpp\matrix にある addmatrix.m ファイルへのパスを保存します。

    appFile = fullfile(matlabroot,'extern','examples','compilersdk','c_cpp','matrix','addmatrix.m');
  2. 以下のコードを addmatrixSample1.m という名前のサンプル ファイルに保存します。

    a1 = [1 4 7; 2 5 8; 3 6 9];
    a2 = a1;
    a = addmatrix(a1, a2);

  3. 関数 compiler.build.cppSharedLibrary を使用して C++ 共有ライブラリをビルドします。名前と値の引数を使用してライブラリ名を指定し、サンプル ファイルを追加します。

    buildResults = compiler.build.cppSharedLibrary(appFile, ...
    'LibraryName','libmatrix', ...
    'SampleGenerationFiles','addmatrixSample1.m');

    compiler.build コマンドで名前と値の引数を使用して、追加オプションを指定できます。詳細については、compiler.build.cppSharedLibrary を参照してください。

    compiler.build.Results オブジェクト buildResults には、ビルド タイプ、生成ファイル、含まれるサポート パッケージ、およびビルド オプションに関する情報が含まれています。

  4. この構文により、現在の作業ディレクトリの libmatrixcppSharedLibrary という名前のフォルダー内に以下のファイルが生成されます。

    • samples\addmatrixSample1_mda.cpp — C++ サンプル ドライバー ファイル。

    • v2\generic_interface\libmatrix.ctf — デプロイ可能なアーカイブが含まれるコンポーネント テクノロジー ファイル。

    • v2\generic_interface\readme.txt — パッケージ化情報が含まれるテキスト ファイル。

    • GettingStarted.html — 共有ライブラリの統合に関する情報が含まれる HTML ファイル。

    • includedSupportPackages.txt — ライブラリに含まれるすべてのサポート ファイルをリストしたテキスト ファイル。

    • mccExcludedFiles.log — アプリケーションに含まれていないすべてのツールボックス関数のリストが含まれるログ ファイル。サポートされていない関数の詳細については、MATLAB Compiler の制限を参照してください。

    • readme.txt — パッケージ化およびインターフェイスの情報が含まれるテキスト ファイル。

    • requiredMCRProducts.txtMATLAB Runtime がアプリケーションを実行するために必要な製品の製品 ID が含まれるテキスト ファイル。

    • unresolvedSymbols.txt — 未解決のシンボルに関する情報が含まれるテキスト ファイル。

    メモ

    生成されたライブラリに MATLAB Runtime やインストーラーは含まれていません。buildResults オブジェクトを使用してインストーラーを作成するには、compiler.package.installer を参照してください。

C++ MATLAB データ API 共有ライブラリをサンプル アプリケーションとともに実装

C++ 共有ライブラリのパッケージ化が完了したら、C++ アプリケーションから呼び出すことができます。作成する C++ アプリケーションでは、パッケージ化の際に生成されたサンプル C++ ドライバー コードを使用します。このサンプル C++ コードは C++ 共有ライブラリを呼び出すもので、以前のセットアップ手順で作成したサンプル MATLAB ファイルを基にしています。

これらの手順は、GettingStarted.html ファイルでも説明されています。開始する前に、MATLAB Runtime のインストールと構成が完了していて、C++ コンパイラがインストールされていることを確認してください。

  1. 生成された C++ ドライバー コード ファイル addmatrixSample1_mda.cppsamples フォルダーからコピーして、libmatrix.ctf ファイルを含む v2\generic_interface フォルダーに貼り付けます。

    addmatrixSample1_mda.cpp のプログラム コードを以下に示します。

    /*================================================================= * * ADDMATRIXSAMPLE1 * Sample driver code that uses the generic interface and * MATLAB Data API to call a C++ shared library created using * MATLAB Compiler SDK. * Refer to the MATLAB Compiler SDK documentation for more * information. * *=================================================================*/ // Include the header file required to use the generic // interface for the C++ shared library generated by the // MATLAB Compiler SDK. #include "MatlabCppSharedLib.hpp" #include <iostream> namespace mc = matlab::cpplib; namespace md = matlab::data; std::shared_ptr<mc::MATLABApplication> setup() { auto mode = mc::MATLABApplicationMode::IN_PROCESS; // Specify MATLAB startup options std::vector<std::u16string> options = {}; std::shared_ptr<mc::MATLABApplication> matlabApplication = mc::initMATLABApplication(mode, options); return matlabApplication; } int mainFunc(std::shared_ptr<mc::MATLABApplication> app, const int argc, const char * argv[]) { md::ArrayFactory factory; md::TypedArray<double> a1In = factory.createArray<double>({3, 3}, {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}); md::TypedArray<double> a2In = factory.createArray<double>({3, 3}, {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}); try { // The path to the CTF (library archive file) passed to // initMATLABLibrary or initMATLABLibraryAsync may be either absolute // or relative. If it is relative, the following will be prepended // to it, in turn, in order to find the CTF: // - the directory named by the environment variable // CPPSHARED_BASE_CTF_PATH, if defined // - the working directory // - the directory where the executable is located // - on Mac, the directory three levels above the directory // where the executable is located // If the CTF is not in one of these locations, do one of the following: // - copy the CTF // - move the CTF // - change the working directory ("cd") to the location of the CTF // - set the environment variable to the location of the CTF // - edit the code to change the path auto lib = mc::initMATLABLibrary(app, u"libmatrix.ctf"); std::vector<md::Array> inputs{a1In, a2In}; auto result = lib->feval(u"addmatrix", 1, inputs); } catch (const std::exception & exc) { std::cerr << exc.what() << std::endl; return -1; } return 0; } // The main routine. On the Mac, the main thread runs the system code, and // user code must be processed by a secondary thread. On other platforms, // the main thread runs both the system code and the user code. int main(const int argc, const char * argv[]) { int ret = 0; try { auto matlabApplication = setup(); ret = mc::runMain(mainFunc, std::move(matlabApplication), argc, argv); // Calling reset() on matlabApplication allows the user to control // when it is destroyed, which automatically cleans up its resources. // Here, the object would go out of scope and be destroyed at the end // of the block anyway, even if reset() were not called. // Whether the matlabApplication object is explicitly or implicitly // destroyed, initMATLABApplication() cannot be called again within // the same process. matlabApplication.reset(); } catch(const std::exception & exc) { std::cerr << exc.what() << std::endl; return -1; } return ret; }
  2. システム コマンド プロンプトで、addmatrixSample1_mda.cpp のコピー先の generic_interface フォルダーに移動します。

  3. システムのコマンド プロンプトで mbuild を使用して、アプリケーションをコンパイルしてリンクします。

    mbuild addmatrixSample1_mda.cpp
  4. システムのコマンド プロンプトからアプリケーションを実行します。

    addmatrixSample1_mda.exe

    生成された C++ コードは出力を表示しません。

メモ

struct 配列、cell 配列、または文字ベクトルを feval の呼び出しから取得して表示する方法の例については、matlabroot\extern\examples\compilersdk\c_cpp\matrixsubtractmatrix.m ファイルおよび subtractmatrix_mda.cpp ファイルを参照してください。

参考

| | |

関連するトピック