MATLAB Compiler3.0で他のプロジェクトから使用可能な Cの共有ライブラリを作成するにはどのようにすればよいですか?
10 ビュー (過去 30 日間)
古いコメントを表示
MATLAB Compiler 3.0(もしくはそれ以前のバージョン)でMicrosoft Visual Studio6 などのIDEで使用可能なCの共有ライブラリを作成する方法を教えてください。MSVC(もしくは他のIDE)プロジェクトでは、main()を起動することなく、初期化を行い、main()を含まないCコードを生成したいのですが。
採用された回答
MathWorks Support Team
2009 年 6 月 29 日
MATLAB Compiler3.0 でC共有ライブラリを作成し、一般的な統合開発環境(IDE)で使用する方法を紹介します。ここでは、Micrrosoft Visual Studio 6 を使用します。
まず、Cの共有ライブラリを作成するには下記の手順にて行います。
1. MATLABファイルを下記コマンドでコンパイルし、DLLに変換します(Windows環境)。
mcc -t -L C -W lib:mylib -T link:lib -h <MATLAB File Name> libmmfile.mlib
-tオプションにより、MATLAB コードをターゲット言語に変換します。
-Lオプションは、ターゲット言語を指定し、ここではC言語が選択されています。
-Wオプションにより、"lib:"の後に指定した名前で、ライブラリのラッパーを生成します。
-Tオプションは、ターゲットフェーズとタイプを指定します。ここでは、共有ライブラリをビルドする時に同時にリンクさせたいもの(例えば、PC上にあるDLLなど)を指定しています。
libmmfile.mlib は、MATLABファイルMathルーチンに対するリンクを示します。これは必要に応じて共有ライブラリにプリコンパイルされます。
これらの手順により、mylib.libとmylib.hが生成されます。
MSVC(もしくは他のIDE)でのデバッグに適したDLLを作成したい場合には、-gオプションを追加してください。
2. mylib.libをMSVC(もしくは他のIDE)のプロジェクトに追加します。
3. コンパイルされたMATLABファイルが呼び出される前に、Cコードにて初期化と終了処理が定義されていることをを確認してください。
初期化では、
mylibInitialize();
その後、終了処理として下記を呼び出します。
mylibTerminate();
mylib.dll内の全てのシンボルは、mylib.hに表示されます。
4. mlfFoo(...)を起動することで、Cソースコード内で MATLAB コードからコンパイルされた関数を呼び出します。
例えば、MATLABでは下記の操作を行います。
1. fooという名前のMATLABファンクションを foo.m という名前で作成します。
function y = foo(x)
y = x+1;
2. MATLABを使って、foo.m をCの共有ライブラリを含むCコードに変換します。
mcc -t -L C -W lib:foolib -T link:lib foo.m libmmfile.mlib
これにより下記のファイルが生成されます。
foo.c
foo.h
foolib.c
foolib.h
foolib.exports
foolib.dll
foolib.exp
foolib.lib
foolib.mlib
次に、Microsoft Visual C/C++ 6.0にて下記の設定を行います。
1. Microsoft Visual C/C++ 6.0IDEを起動します。
2. [ファイル] -> [新規]へ進み、[プロジェクト]タブを選択します。”Win32コンソールアプリケーション”を選択し、[プロジェクト名]で "test" と入力します。"新しいワークスペースを作成する"にチェックが入っており、また [プラットフォーム]で、"Win32"が選択されていることを確認し、[OK]を選択します。
3. [ファイルビュー]タブを選択し、test ファイル上でダブルクリックします、[ソースファイル]を選択し、[プロジェクト]->[プロジェクトの追加]を選択し、[新規] を選択します。[ファイル]タブでC++ソースファイルを選択し、"プロジェクトの追加"にチェックをし、[ファイル名]に "foowrap.c"を入力します。
4. foowap.cファイルに下記コードを入力します。
#include "foolib.h"
#include "matlab.h"
#include <stdio.h>
void main(void)
{
mxArray *x_ptr;
mxArray *y_ptr;
double *y;
double ret;
/* Create an mxArray to input into mlfFoo */
x_ptr = mxCreateDoubleScalar(1);
/* Call the library initialization function */
foolibInitialize();
/* Call the implementation function */
y_ptr = mlfFoo(x_ptr);
/* Call the library termination function */
foolibTerminate();
/* The return value from mlfFoo is an mxArray so we must extract the data from it */
y = mxGetPr(y_ptr);
ret = *y;
/* Print a double precision number*/
printf("The output of foo is %f\n",ret);
mxDestroyArray(x_ptr);
mxDestroyArray(y_ptr);
}
5. testファイル上で右クリックし、[プロジェクトへファイルの追加]を選択し、
foolib.lib
を選択し、また、$MATLAB\extern\lib\win32\microsoft\msvc60に保存されている下記のファイルを追加します。
libmatlb.lib
libmmfile.lib
libmx.lib
6. testファイルをハイライトさせ、右クリックし、[設定]を選択します。[C/C++]タブを選択し、[カテゴリ]のリストボックスから"コード生成"を選択します。[ランタイムライブライブラリを使用]のリストボックスから"マルチスレッドDLL"を選択します。[カテゴリ]のリストボックスを "プロセッサ"に変更します。プロセッサ定義MSVC,MSWIND,IBMPCを追加します。
変更前:WIN32,_DEBUG,_CONSOLE,_MBCS
変更後:WIN32,_DEBUG,_CONSOLE,_MBCS,MSVC,MSWIND,IBMPC
[追加インクルードディレクトリ]に下記パスを追加します。ここで、$MATLAB は、MATLABインストールディレクトリを指します。
$MATLAB\extern\include\cpp;$MATLAB\extern\include
さらに、foolib.hが保存されているディレクトリのフルパスをカンマ区切りで追加します。
7. [ビルド] ->[ リビルド]を選択します。
8. test.exeが生成されます。
9. test.exe と同じフォルダに foolib.dllを保存します。
MATLAB Compiler で生成したDLLをVisual C++環境から呼び出す詳細については、下記のソリューションを参照してください。
0 件のコメント
その他の回答 (0 件)
参考
カテゴリ
Help Center および File Exchange で MATLAB 関数のパッケージ化 についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!