C++ mwArray API 共有ライブラリの生成と C++ アプリケーションのビルド
サポートされるプラットフォーム: Windows®、Linux®、Mac
この例では、MATLAB® 関数から C++ 共有ライブラリを作成する方法を説明します。生成されたライブラリは、C++ アプリケーションに統合できます。また、この例では、C++ アプリケーションから C++ 共有ライブラリを呼び出す方法も示します。MATLAB のライセンス コピーがターゲット システムにインストールされている必要はありません。
MATLAB での関数の作成
MATLAB で、パッケージ化する MATLAB コードを調べます。
この例では、MATLAB に付属している
matrix
フォルダーを作業フォルダーにコピーします。copyfile(fullfile(matlabroot,'extern','examples','compilersdk','c_cpp','matrix'),'matrix')
作業フォルダー内の新しい
matrix
サブフォルダーに移動します。関数
addmatrix.m
、multiplymatrix.m
、およびeigmatrix.m
を確認してテストします。関数を呼び出す MATLAB サンプル コードを作成します。サンプル ファイルを使用して、ターゲット言語のサンプル アプリケーションを生成します。詳細と制限については、サンプル ドライバー ファイルの作成を参照してください。
以下のコードを
libmatrixSample.m
という名前のサンプル ファイルに保存します。% Sample script to demonstrate execution of functions % addmatrix, eigmatrix, and multiplymatrix a1 = [1 4 7; 2 5 8; 3 6 9]; % Initialize a1 here a2 = a1; % Initialize a2 here a = addmatrix(a1, a2); e = eigmatrix(a1); m = multiplymatrix(a1, a2);
パッケージ化手順で、サンプル ドライバー ファイルをまったく含めないことも選択できます。独自の C++ アプリケーション コードを作成する場合、MATLAB 関数のパッケージ化が完了してから
mbuild
を使用して適切なディレクトリに移動し、コンパイルできます。
ライブラリ コンパイラ アプリを使用した C++ 共有ライブラリの作成
[MATLAB アプリ] タブで、[アプリ] セクションの右端にある矢印をクリックします。[アプリケーションのデプロイ] で、[ライブラリ コンパイラ] をクリックします。
または、MATLAB コマンド プロンプトで以下を入力して、[ライブラリ コンパイラ] アプリを開きます。
libraryCompiler
ツールストリップの [タイプ] セクションで、[C++ 共有ライブラリ] をクリックします。
ライブラリ コンパイラ アプリのプロジェクト ウィンドウで、デプロイする MATLAB アプリケーションのファイルを指定します。
ツールストリップの [エクスポートする関数] セクションで、 をクリックします。
[ファイルの追加] ウィンドウで、サンプルのフォルダーを参照し、パッケージ化する関数を選択します。[開く] をクリックします。
エクスポートする関数ファイルのリストに関数が追加されます。同じアプリケーションに複数のファイルをパッケージ化するには、この手順を繰り返します。
addmatrix.m
、multiplymatrix.m
、およびeigmatrix.m
をメイン ファイルのリストに追加します。ツールストリップの [パッケージ化オプション] セクションで次のオプションのいずれかを選択して、生成されるアプリケーションに MATLAB Runtime インストーラーを含めるかどうかを決定します。
ランタイムを Web からダウンロード — MATLAB Runtime をダウンロードしてデプロイされた MATLAB アプリケーションと共にインストールするインストーラーを生成します。インストーラーのファイル名を指定できます。
ランタイムをパッケージに含める — MATLAB Runtime インストーラーを含むアプリケーションを生成します。インストーラーのファイル名を指定できます。
メモ
このオプションを初めて選択したときに、MATLAB Runtime インストーラーをダウンロードするように求めるメッセージが表示されます。
共有ライブラリ設定の指定
[ライブラリ名] フィールドに、パッケージ化された共有ライブラリの名前として
addmatrix
が自動的に入力されます。この名前をlibmatrix
に変更します。同じ名前が、共有ライブラリの実装時にも使用されます。以前に作成した MATLAB サンプル ファイル
libmatrixSample.m
を追加します。C++ ドライバー ファイルは共有ライブラリの作成に必須ではありませんが、C++ mwArray API 共有ライブラリを C++ サンプル アプリケーションとともに実装の方法を示すために使用します。[サンプル] セクションで、[既存のサンプルの追加] を選択して
libmatrixSample.m
を選択します。生成される C++ 共有ライブラリの API の種類を選択します。下部の [API の選択] セクションで、[mwArray API を使用するインターフェイスの作成] を選択します。既定のオプションのままにして両方のインターフェイスを作成することもできます。詳細については、C++ 共有ライブラリの API の選択を参照してください。
アプリケーションとその外観のカスタマイズ
ライブラリ コンパイラ アプリでは、インストーラーをカスタマイズし、アプリケーションをカスタマイズし、アプリケーションについて情報を追加することができます。
ライブラリ情報 — デプロイされるアプリケーションに関する情報。また、アプリケーション アイコンとスプラッシュ スクリーンを変更して、アプリケーションの外観をカスタマイズすることもできます。生成されるインストーラーはこの情報を使用して、インストールされるアプリケーションのメタデータを入力します。インストーラーのカスタマイズを参照してください。
追加インストーラー オプション — 生成されるインストーラーの既定のインストール パスと、カスタム ロゴの選択。インストール パスの変更を参照してください。
ライブラリの実行に必要なファイル — 生成されるアプリケーションを実行するために必要な追加ファイル。これらのファイルは、生成されるアプリケーション インストーラーに含められます。コンパイラ プロジェクトの必須ファイルの管理を参照してください。
エンド ユーザー用にインストールされるファイル — アプリケーションと共にインストールされるファイル。
アプリケーションと共にインストールするファイルの指定を参照してください。
アプリケーションのパッケージ化
パッケージ化オプションの選択が終了したら、ライブラリ コンパイラのプロジェクトを保存し、パッケージ化されたアプリケーションを生成します。
[パッケージ化] をクリックします。
[プロジェクトを保存] ダイアログ ボックスで、プロジェクトを保存する場所を指定します。
[パッケージ] ダイアログ ボックスで、[プロセスが完了したら出力フォルダーを開く] が選択されていることを確認します。
パッケージ化プロセスが完了したら、ターゲット フォルダー内の生成された出力を調べます。
3 つのフォルダー
for_redistribution
、for_redistribution_files_only
、およびfor_testing
が生成されます。これらのフォルダーに生成されるファイルの詳細については、MATLAB 関数のパッケージ化後に生成されるファイルを参照してください。
ログ ファイル
PackagingLog.html
にはパッケージ化の結果が含まれています。
compiler.build.cppSharedLibrary
を使用した C++ 共有ライブラリの作成
ライブラリ コンパイラ アプリの代わりに、プログラムによる方法を使用して C++ 共有ライブラリを作成できます。ライブラリ コンパイラを使用してライブラリを既に作成している場合は、C++ mwArray API 共有ライブラリを C++ サンプル アプリケーションとともに実装を参照してください。
関数ファイルのリストを cell 配列に保存します。
functionfiles = {'addmatrix.m', 'multiplymatrix.m', 'eigmatrix.m'}
関数
compiler.build.cppSharedLibrary
を使用して C++ 共有ライブラリをビルドします。名前と値の引数を使用してサンプル ファイルを追加し、ライブラリ名とインターフェイス API を指定します。buildResults = compiler.build.cppSharedLibrary(functionfiles,... 'LibraryName','libmatrix',... 'Interface','mwarray',... 'SampleGenerationFiles','libmatrixSample.m');
compiler.build
コマンドで名前と値の引数を使用して、追加オプションを指定できます。詳細については、compiler.build.cppSharedLibrary
を参照してください。compiler.build.Results
オブジェクトbuildResults
には、ビルド タイプ、生成ファイル、含まれるサポート パッケージ、およびビルド オプションに関する情報が含まれています。この関数により、現在の作業ディレクトリにある
libmatrixcppSharedLibrary
という名前のフォルダー内に以下のファイルが生成されます。samples\libmatrixSample1_mwarray.cpp
— 関数addmatrix
を呼び出す C++ サンプル アプリケーション。samples\libmatrixSample2_mwarray.cpp
— 関数eigmatrix
を呼び出す C++ サンプル アプリケーション。samples\libmatrixSample3_mwarray.cpp
— 関数multiplymatrix
を呼び出す C++ サンプル アプリケーション。GettingStarted.html
— 共有ライブラリの統合に関する情報が含まれる HTML ファイル。includedSupportPackages.txt
— ライブラリに含まれるすべてのサポート ファイルをリストしたテキスト ファイル。libmatrix.cpp
— C++ ソース コード ファイル。libmatrix.def
— リンカーにモジュール情報を提供するモジュール定義ファイル。libmatrix.dll
— ダイナミックリンク ライブラリ ファイル。libmatrix.exports
— すべての非静的関数名が含まれるエクスポート ファイル。libmatrix.h
— C++ ヘッダー ファイル。libmatrix.lib
— インポート ライブラリ ファイル。mccExcludedFiles.log
— アプリケーションに含まれていないすべてのツールボックス関数のリストが含まれるログ ファイル。サポートされていない関数の詳細については、MATLAB Compiler の制限を参照してください。readme.txt
— パッケージ化情報が含まれるテキスト ファイル。requiredMCRProducts.txt
— MATLAB Runtime がアプリケーションを実行するために必要な製品の製品 ID が含まれるテキスト ファイル。unresolvedSymbols.txt
— 未解決のシンボルに関する情報が含まれるテキスト ファイル。
メモ
生成されたライブラリに MATLAB Runtime やインストーラーは含まれていません。
buildResults
オブジェクトを使用してインストーラーを作成するには、compiler.package.installer
を参照してください。
C++ mwArray API 共有ライブラリを C++ サンプル アプリケーションとともに実装
メモ
3 つすべての関数を呼び出してエラーを処理する、より高度なアプリケーションを使用してライブラリを呼び出すには、次のフォルダーに配置されている C++ アプリケーション matrix_mwarray.cpp
を使用します。
matlabroot
\extern\examples\compilersdk\c_cpp\matrix
開始する前に、MATLAB Runtime のインストールと構成が完了していて、C++ コンパイラがインストールされていることを確認してください。
C++ 共有ライブラリをパッケージ化した後、C++ アプリケーションから呼び出すことができます。samples
フォルダーで生成された C++ アプリケーションは、作成したサンプル MATLAB ファイルを基にしています。
生成された C++ コード ファイル
libmatrixSample1_mwarray.cpp
をsamples
フォルダーからコピーして、libmatrix.lib
を含むフォルダーに貼り付けます。libmatrixSample1_mwarray.cpp
のプログラム コードを以下に示します。/*================================================================= * * LIBMATRIXSAMPLE1 * CPP Sample driver code for libmatrix that calls a shared library * created using MATLAB Compiler SDK. * Refer to the MATLAB Compiler SDK documentation for more information. * *=================================================================*/ // Include the library specific header file as generated by the // MATLAB Compiler #include <iostream> #include "libmatrix.h" void addmatrixSample() { try { mxDouble a1InData[] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}; mwArray a1In(3, 3, mxDOUBLE_CLASS); a1In.SetData(a1InData, 9); mxDouble a2InData[] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}; mwArray a2In(3, 3, mxDOUBLE_CLASS); a2In.SetData(a2InData, 9); mwArray aOut; addmatrix(1, aOut, a1In, a2In); std::cout << aOut << '\n'; } catch (const mwException& e) { std::cerr << e.what() << std::endl; } catch (...) { std::cerr << "Unexpected error thrown" << std::endl; } } int run_main(int argc, const char** argv) { if (!libmatrixInitialize()) { std::cerr << "Could not initialize the library properly" << std::endl; return 2; } else { addmatrixSample(); // Call the application and library termination routine libmatrixTerminate(); } // Note that you should call mclTerminateApplication at the end of // your application to shut down all MATLAB Runtime instances. mclTerminateApplication(); return 0; } // The main routine. On macOS, 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(int argc, const char** argv) { /* Call the mclInitializeApplication routine. Make sure that the application * was initialized properly by checking the return status. This initialization * has to be done before calling any MATLAB APIs or MATLAB Compiler SDK * generated shared library functions. */ if (!mclInitializeApplication(nullptr, 0)) { std::cerr << "Could not initialize the application." << std::endl; return 1; } return mclRunMain(static_cast<mclMainFcnType>(run_main), argc, argv); }
システム コマンド プロンプトで、
libmatrixSample1_mwarray.cpp
のコピー先のフォルダーに移動します。MATLAB プロンプトまたはシステムのコマンド プロンプトで
mbuild
を使用して、アプリケーションをコンパイルしてリンクします。mbuild libmatrixSample1_mwarray.cpp libmatrix.lib
メモ
Windows では
.lib
拡張子が使用されます。macOS でのファイル拡張子は.dylib
、Linux でのファイル拡張子は.so
です。システムのコマンド プロンプトからアプリケーションを実行します。パッケージ化手順でサンプル MATLAB コードを使用した場合、サンプル C++ アプリケーションはその MATLAB コードと同じ出力を返します。
libmatrixSample1_mwarray.exe
2 8 14 4 10 16 6 12 18
(オプション)
mbuild
を使用して、その他のサンプル C++ アプリケーションをコンパイルしてリンクします。生成された C++ コードは、独自のアプリケーションを作成するためのガイドとしても使用できます。詳細については、Integrate C++ Shared Libraries with mwArrayを参照してください。
参考
compiler.build.cppSharedLibrary
| ライブラリ コンパイラ | mcc
| deploytool