ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

共有ライブラリのサポートの制限

MATLAB における C ライブラリ ルーチンのサポート

MATLAB® 共有ライブラリ インターフェイスでは、C ライブラリ ルーチンのみがサポートされます。複数の言語およびプラットフォームでの使用を前提に設計された製品仕様のライブラリであれば、ほぼすべて使用できます。詳細については、共有ライブラリの C 関数の呼び出しを参照してください。

多くの非商用ライブラリや、C++ からしかテストされていないライブラリは、インターフェイスが使用できなかったり、変更やインターフェイス層を必要とするものであったりします。この場合は MEX ファイルを使用することをお勧めします。

C++ ライブラリ読み込み時の対処方法

共有ライブラリ インターフェイスは C++ クラスやオーバーロードされた関数要素をサポートしていません。ただし、ライブラリのソース コードがある場合は、次の手法のいずれかを適用し、loadlibrary を使用して C++ ライブラリを読み込むことができます。ソース コードの編集後、ライブラリをリビルドします。

関数を extern "C" として宣言

たとえば、ファイル shrlibsample.h の次の関数プロトタイプは、各関数に使用する構文を示します。

#ifdef __cplusplus
extern "C" {
#endif
void addMixedTypes(
  short  x,
  int    y,
  double z
);

/* other prototypes may be here */

#ifdef __cplusplus
}
#endif

次の C++ コードは、ヘッダー ファイルに適切な C コードではありません。

extern "C" void addMixedTypes(short x,int y,double z); 

Visual Studio でのモジュール定義ファイルの追加

Microsoft® Visual Studio® で C++ コードから DLL をビルドする際に、プロジェクトにモジュール定義ファイル (.DEF) を追加します。DEF ファイルには少なくとも、次のモジュール定義ステートメントが含まれなければなりません。

  • ファイルの最初のステートメントが必ず LIBRARY ステートメントであること。

  • EXPORTS ステートメントが、DLL によりエクスポートされる関数の名前、さらに必要に応じてその序数値をリストすること。

たとえば、DLL によって関数 multDoubleArray と関数 addMixedTypes がエクスポートされる場合、module.def には次項が含まれます。

LIBRARY 
EXPORTS 
multDoubleArray 
addMixedTypes 

関数 printf の使用の制限

MATLAB では、C の関数 printf の出力はコマンド ウィンドウに表示されません。

ビット フィールド

int 型または同等の型を使用して、ビット フィールド宣言を変更できます。たとえば、ライブラリのヘッダー ファイルで次のように宣言されているとします。

int myfunction();

struct mystructure
{
    /* note the sum of fields bits */
    unsigned field1 :4;
    unsigned field2 :4;
};

ヘッダー ファイルを編集して次のように置き換えます。

int myfunction();

struct mystructure
{
    /* field 8 bits wide to be manipulated in MATLAB */
    /* A char is 8 bits on all supported platforms */
    char allfields; 
};

ソース コードの編集後、ライブラリをリビルドします。こうして MATLAB でビット マスクを使用して、2 つのフィールドのデータにアクセスできます。

enum 宣言

enumchar 定義はサポートされていません。C では、たとえば 'A' という char 定数はそれに等価の数値 (65) に自動変換されます。MATLAB は定数を変換しません。この型の enum を使用するには、ヘッダー ファイルを編集して 'A' を数字 65 に置き換えます (int8('A') == 65)。たとえば、

enum Enum1 {ValA='A',ValB='B'};

を次に置き換えます。

enum Enum1 {ValA=65,ValB=66};

そのうえで、ライブラリをリビルドします。

共用体の非サポート

共用体はサポートされていません。回避方法として、ソース コードを変更して union の宣言を取り除き、代替となる最大のもので置き換えます。次に、結果を解釈するために、必要に応じて MATLAB コードを作成します。たとえば、ソース コードを編集して、次の共用体を

struct mystruct
{
    union 
    {
       struct {char byte1,byte2;};
	       short word;
    };
};

次に置き換えます。

struct mystruct 
{
    short word;
};

リトルエンディアン ベースのマシンでは、byte1mod(f,256)byte2f/256、そして word=byte2*256+byte1 となります。ソース コードの編集後、ライブラリをリビルドします。

コンパイラの依存関係

ヘッダー ファイルは、プラットフォームでサポートされているコンパイラとの互換性がなければなりません。サポートされているコンパイラの最新の一覧については、Supported and Compatible Compilers (サポートされるコンパイラ) Web サイトを参照してください。 他のコンパイラに明示的に依存する外部ライブラリは読み込めません。

ポインターの使用制限

関数ポインター

共有ライブラリ インターフェイスは、関数ポインターと連動するライブラリ関数はサポートしません。

マルチレベル ポインター

マルチレベル ポインターとポインターを含む構造体はサポート制限があります。3 つ以上の間接レベルで宣言された入出力および構造体メンバーの使用はサポートされていません。たとえば、double ***outp から doublePtrPtrPtr への変換はサポートされていません。

可変数の関数入力引数の指定は非サポート

共有ライブラリ インターフェイスでは、省略記号 (...) で表される可変数の引数をもつライブラリ関数はサポートされていません。

関数の呼び出しに使用する引数のセットごとに 1 つのプロトタイプ ファイル内で複数のエイリアス関数を作成できます。詳細は、MATLAB プロトタイプ ファイルを参照してください。

関連するトピック