メインコンテンツ

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

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

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

MATLAB での関数の作成

  1. MATLAB で、パッケージ化する MATLAB コードを調べます。

    この例では、MATLAB に付属している matrix フォルダーを作業フォルダーにコピーします。

    copyfile(fullfile(matlabroot,'extern','examples','compilersdk','c_cpp','matrix'),'matrix')

    作業フォルダー内の新しい matrix サブフォルダーに移動します。

  2. 関数 addmatrix.mmultiplymatrix.m、および eigmatrix.m を確認してテストします。

  3. 関数を呼び出す MATLAB サンプル コードを作成します。サンプル ファイルを使用して、ターゲット言語のサンプル アプリケーションを生成します。詳細と制限については、Create Sample Code to Call Exported Functionを参照してください。

    以下のコードを 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 を使用して適切なディレクトリに移動し、コンパイルできます。

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

プログラムによる方法を使用して C++ 共有ライブラリをビルドします。あるいは、グラフィカル インターフェイスを使用して C++ 共有ライブラリを作成する場合は、Package MATLAB Function Using C++ Shared Library Compiler App with mwArray APIを参照してください。

  1. 関数ファイルのリストを cell 配列に保存します。

    functionfiles = {'addmatrix.m', 'multiplymatrix.m', 'eigmatrix.m'}
  2. 関数 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.txtMATLAB 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
詳細については、Integrate C++ Shared Libraries with mwArrayを参照してください。

開始する前に、C++ コンパイラがインストールされていることを確認してください。

C++ 共有ライブラリをパッケージ化した後、C++ アプリケーションから呼び出すことができます。samples フォルダーで生成された C++ アプリケーションは、作成したサンプル MATLAB ファイルを基にしています。

  1. 生成された C++ コード ファイル libmatrixSample1_mwarray.cppsamples フォルダーからコピーして、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);
    }
    
  2. システム コマンド プロンプトで、libmatrixSample1_mwarray.cpp のコピー先のフォルダーに移動します。

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

    mbuild libmatrixSample1_mwarray.cpp libmatrix.lib

    メモ

    Windows では .lib 拡張子が使用されます。macOS でのファイル拡張子は .dylib、Linux でのファイル拡張子は .so です。

  4. システムのコマンド プロンプトからアプリケーションを実行します。パッケージ化手順でサンプル MATLAB コードを使用した場合、サンプル C++ アプリケーションはその MATLAB コードと同じ出力を返します。

    libmatrixSample1_mwarray.exe
    2 8 14
    4 10 16
    6 12 18
    
  5. (オプション) mbuild を使用して、その他のサンプル C++ アプリケーションをコンパイルしてリンクします。生成された C++ コードは、独自のアプリケーションを作成するためのガイドとしても使用できます。

    詳細については、Integrate C++ Shared Libraries with mwArrayを参照してください。

参考

|

トピック