Main Content

mex

MEX 関数またはエンジン アプリケーションのビルド

説明

mex filenamesC++ 用の MATLAB データ APIで作成された 1 つ以上の C++ ソース ファイルをコンパイルして、現在のフォルダー内のバイナリ MEX ファイルにリンクします。これらのアプリケーションを作成する方法の詳細については、MATLAB (MEX ファイル) から呼び出せる C++ 関数の記述を参照してください。

C 行列 APIまたはFortran 行列 APIに基づいて MEX ファイルを作成する場合、mex filenames は 1 つ以上の C、C++、Fortran のソース ファイルを -R2017b api でビルドします。MATLAB® の将来のバージョンでは、既定の api オプションによってインターリーブされた複素数 API (-R2018a) を使用するように変更されます。MathWorks では、MEX ファイルを作成して既存の MEX ファイルを更新し、インターリーブされた複素数 API を使用することを推奨しています。あるいは、MX_HAS_INTERLEAVED_COMPLEX マクロを使用して、MATLAB の複数バージョンにわたって目的の動作を適用します。詳細については、MATLAB の MEX 関数におけるインターリーブされた複素数 API のサポートを参照してください。

C、C++、Fortran の各アプリケーションを操作する方法の詳細については、外部プログラミング言語およびシステムと MATLAB の統合を参照してください。

mex filenames api option1 ... optionN は指定された api 引数とオプションの option1 ... optionN 引数を使用してビルドします。option1 ... optionN 引数は、既定の mex ビルド構成を補足またはオーバーライドします。

mex -client engine filenamesC++ 用の MATLAB データ APIで作成された C++ ソース ファイルをスタンドアロンの MATLAB エンジン アプリケーションにビルドします。詳細については、C++ エンジン プログラムの要素を参照してください。

C 用の MATLAB エンジン APIC MAT ファイル APIFortran エンジン API、または Fortran MAT ファイル API に基づいてアプリケーションを作成する場合、mex -client engine filenames-R2017b api を使ってスタンドアロン アプリケーションをビルドします。MATLAB の将来のバージョンでは、既定の api オプションによってインターリーブされた複素数 API (-R2018a) を使用するように変更されます。MathWorks では、エンジン アプリケーションを作成して既存のアプリケーションを更新し、インターリーブされた複素数 API を使用することを推奨しています。

mex -client engine filenames api option1 ... optionN は指定した api 引数とオプションの option1 ... optionN 引数を使用してエンジン アプリケーションをビルドします。

mex -setup [lang] は、MEX ファイルをビルドするために指定された言語に対するコンパイラについての情報を表示します。MATLAB はサポートされる言語ごとに既定のコンパイラを定義します。特定の言語に複数のコンパイラがある場合、lang オプションを使用してその言語の既定のコンパイラを変更します。詳細については、既定のコンパイラの変更C++ コンパイラの選択を参照してください。

mex -setup -client engine [lang] はエンジン アプリケーションをビルドするためのコンパイラを選択します。

すべて折りたたむ

matlabroot/extern/examples フォルダーからソース コードの例をコピーします。

copyfile(fullfile(matlabroot,'extern','examples','mex','explore.c'),'.','f')

MEX ファイルをビルドします。出力には、コンパイラ固有の情報が表示されます。

mex -R2018a explore.c

複素数行列を渡して、関数をテストします。

a = [1 3 5];
b = [5 3 1];
A = complex(a,b);
explore(A)
------------------------------------------------
Name: prhs[0]
Dimensions: 1x3
Class Name: double
------------------------------------------------
	(1,1) = 1 + 5i
	(1,2) = 3 + 3i
	(1,3) = 5 + 1i

単一の C プログラム yprime.c を MEX ファイルにビルドします。

matlabroot/extern/examples フォルダーからソース コードの例をコピーします。

copyfile(fullfile(matlabroot,"extern","examples","mex","yprime.c"),".","f")

MEX ファイルをビルドします。出力には、コンパイラ固有の情報が表示されます。

mex yprime.c
Building with 'Microsoft Visual C++ 2019 (C)'.
MEX completed successfully.

テストします。

T=1;
Y=1:4;
yprime(T,Y)
ans = 1×4

    2.0000    8.9685    4.0000   -1.0947

コンパイルやリンクのコマンドおよびトラブルシューティングに役立つその他の情報を表示するには、詳細モードを使用します。出力には、プラットフォームおよびコンパイラ固有の情報が表示されます。

mex -v -compatibleArrayDims yprime.c

環境変数を使用して、コンパイラに渡す追加のオプションを指定します。

変数名の特定:

  • MinGW®macOS、および Linux® のコンパイラで C++ コードをビルドする場合、CXXFLAGS を使用します。

  • MinGW、macOS、および Linux のコンパイラで C コードをビルドする場合、CFLAGS を使用します。

  • Microsoft® Visual Studio® コンパイラの場合、COMPFLAGS を使用します。

Visual Studio で MEX ファイルをビルドする場合は C++17 標準を指定します。

mex COMPFLAGS="$COMPFLAGS /std:c++17" yprime.c

string の区切り記号の使用に関するプラットフォーム別の詳細については、既定のコンパイラ スイッチ オプションのオーバーライドを参照してください。

-Wall を既存のコンパイラ フラグに付加して、yprime.c MEX ファイルをビルドします。値にスペース文字が含まれているので、文字列を区切らなければなりません。使用する区切り文字はプラットフォームに依存します。

MATLAB プロンプトで、一重引用符 (') を使用します。

mex -v COMPFLAGS='$COMPFLAGS -Wall' yprime.c

gcc/g++ を基にした MinGW-w64 コンパイラでは、Linux コンパイラ フラグを使用します。次のコマンドのいずれかを選択してください。

mex -v CXXFLAGS='$CXXFLAGS -Wall' yprime.c % C++ compiler
mex -v CFLAGS='$CFLAGS -Wall' yprime.c     % C compiler 

Windows® コマンド プロンプトでは二重引用符 (") を使用してください。

mex -v COMPFLAGS="$COMPFLAGS -Wall" yprime.c

macOS と Linux 上のシェル コマンド ラインでは、一重引用符 (') を使用してください。

mex -v CFLAGS='$CFLAGS -Wall' yprime.c

MEX ファイルの例 fulltosparse は、loadsparse.Ffulltosparse.F の 2 つの Fortran ソース ファイルで構成されます。この例を実行するには、サポートされる Fortran コンパイラがシステムにインストールされている必要があります。

ソース ファイルを現在のフォルダーにコピーします。

copyfile(fullfile(matlabroot,'extern','examples','refbook','loadsparse.F'),'.','f')
copyfile(fullfile(matlabroot,'extern','examples','refbook','fulltosparse.F'),'.','f')

fulltosparse MEX ファイルをビルドします。コマンド ラインの最初のファイルが fulltosparse.F なので、MEX ファイルの名前は fulltosparse です。出力には、コンパイラ固有の情報が格納されます。

mex -largeArrayDims fulltosparse.F loadsparse.F
Building with 'Intel Visual Fortran Composer XE 2013 with Microsoft Visual Studio 2012'.
MEX completed successfully.

テストします。

full = eye(5);
spar = fulltosparse(full)
spar =

    1,1         1
    2,2         1
    3,3         1
    4,4         1
    5,5         1

現在のフォルダー内のすべての C ソース ファイルを MEX ファイル mymex にまとめます。MEX ファイルの名前を制御するには、-output オプションを使用します。

mex -output mymex *.c

ビルド コマンドを実行せずにその詳細をプレビューするには、-n オプションを使用します。出力には、プラットフォームおよびコンパイラ固有の情報が表示されます。

mex -n yprime.c

ソース MEX ファイルとは別にコンパイルするオブジェクト ファイルにリンクすることができます。

MEX ファイルの例 fulltosparse は、2 つの Fortran ソース ファイルで構成されます。fulltosparse ファイルは、mexFunction サブルーチンを含むゲートウェイ ルーチンです。loadsparse には、計算ルーチンが含まれています。

この例を実行するには、サポートされる Fortran コンパイラがシステムにインストールされている必要があります。計算サブルーチンを現在のフォルダーにコピーします。

copyfile(fullfile(matlabroot,'extern','examples','refbook','loadsparse.F'),'.','f')

サブルーチンをコンパイルし、オブジェクト ファイルを別のフォルダー c:\objfiles に配置します。

mkdir c:\objfiles
mex -largeArrayDims -c -outdir c:\objfiles loadsparse.F
Building with 'Intel Visual Fortran Composer XE 2013 with Microsoft Visual Studio 2012'.
MEX completed successfully.

ゲートウェイ サブルーチンを現在のフォルダーにコピーします。コンパイルして loadsparse オブジェクト ファイルとリンクします。

copyfile(fullfile(matlabroot,'extern','examples','refbook','fulltosparse.F'),'.','f')
mex -largeArrayDims fulltosparse.F c:\objfiles\loadsparse.obj
Building with 'Intel Visual Fortran Composer XE 2013 with Microsoft Visual Studio 2012'.
MEX completed successfully.

複素数ルーチンを処理するための MATLAB LAPACK ライブラリ サブルーチンをインクルードするパスを指定するには、-I オプションを使用します。これらのサブルーチンを使用するには、MEX ファイルがヘッダー ファイル fort.h にアクセスしなければなりません。

matrixDivideComplex.c 例を現在のフォルダーにコピーします。

copyfile(fullfile(matlabroot,'extern','examples','refbook','matrixDivideComplex.c'),'.','f')

'-I'fort.h ファイルへのパスを連結して、引数 -I を作成します。

ipath = ['-I' fullfile(matlabroot,'extern','examples','refbook')];

LAPACK ライブラリ ファイルの名前とパスを表す変数と複素数処理ルーチンを含むファイル fort.c を作成します。

lapacklib = fullfile(matlabroot,'extern','lib',computer('arch'),'microsoft','libmwlapack.lib');
fortfile = fullfile(matlabroot,'extern','examples','refbook','fort.c');

MEX ファイルをビルドします。

mex('-v','-R2017b',ipath,'matrixDivideComplex.c',fortfile,lapacklib)

Windows プラットフォームで matrixDivide.c の例をビルドします。これには -L および -l オプションを使用して、libmwlapack.lib ライブラリを指定します。ライブラリ ファイルは matlabroot\extern\lib\arch\microsoft フォルダーにあります。

matrixDivide.c 例を現在のフォルダーにコピーします。

copyfile(fullfile(matlabroot,'extern','examples','refbook','matrixDivide.c'),'.','f')

mex コマンドで使用するために、このステートメントによって表示される matlabroot の値を取得します。

matlabroot
ans =

C:\Program Files\MATLAB\R2014a

mex コマンドで使用するために、このステートメントによって表示される arch の値を取得します。

computer('arch')
ans =

win64

MEX ファイルをビルドするために、matlabrootarch の値を mex コマンドにコピーします。

mex '-LC:\Program Files\MATLAB\R2014a\extern\lib\win64\microsoft' ...
   -llibmwlapack matrixDivide.c

パスの \Program Files にはスペースが含まれているので、文字 ' を使用しなければなりません。

mxcreatecharmatrixfromstr.c では、#define シンボル SPACE_PADDING を使用して、行列内の文字ベクトル間にどの文字を使うかを定義します。値を設定するには、-D オプションを使用して MEX ファイルをビルドします。

例を現在のフォルダーにコピーします。

copyfile(fullfile(matlabroot,'extern','examples','mx','mxcreatecharmatrixfromstr.c'),'.','f')

SPACE_PADDING 命令を設定して、値の間にスペースを追加します。

mex mxcreatecharmatrixfromstr.c -DSPACE_PADDING
Building with 'MinGW64 Compiler  C '.
MEX completed successfully.

engwindemo.c エンジンの例を現在のフォルダーにコピーします。

copyfile(fullfile(matlabroot,'extern','examples','eng_mat','engwindemo.c'),'.','f')

-client engine 構文を使用して、スタンドアロンの MATLAB エンジン アプリケーションをビルドします。

mex -client engine engwindemo.c

Windows プラットフォームを使用している場合、最初に MATLAB を COM サーバーとして登録しなければなりません。詳細については、COM サーバーとしての MATLAB の登録を参照してください。

例を実行します。

!engwindemo
mex -setup

MATLAB はサポートされるコンパイラのリストに基づいて、お使いのバージョンおよびシステム用のオプションを表示します。

mex リンク コマンドにオプションを追加するには、LINKFLAGS コマンド ライン オプションを使用します。たとえば、Windows で mymex.c をビルドするときに実行可能ファイルの環境を指定するには、次のように入力します。

mex -v LINKFLAGS='$LINKFLAGS /subsystem:windows' mymex.c

入力引数

すべて折りたたむ

名前とファイル拡張子を含む 1 つ以上のファイル名。string または文字ベクトルとして指定します。ファイルが現在のフォルダーにない場合は、ファイルへの絶対パスを指定します。

ファイル名には、以下を任意に組み合わせることができます。

  • C、C++ または Fortran のソース ファイル。

  • Simulink® S-Function ファイル。

  • オブジェクト ファイル。

  • スタティック ライブラリ ファイル。filenames はライブラリ ファイルへの完全修飾パスを含まなければなりません。ライブラリは、mex で現在使用されているのと同じコンパイラを使用してコンパイルする必要があります。

    ダイナミック ライブラリをリンクするには、-llibname オプションを使用します。

filenames のリストに最初に現れるソース コード ファイルが、バイナリ MEX ファイルまたはエンジン アプリケーションの名前になります。この命名規則をオーバーライドするには、-output オプションを使用します。

MATLAB エディターを使用してソース コードを作成します。Microsoft Visual Studio または Xcode などの統合開発環境 (IDE) を使用する場合、mex コマンドを使用するか、MEX スクリプト オプションによるカスタム ビルドのガイドラインに従うことができます。

MATLAB は、コンパイラがインストールされている場合には、filenames 引数の言語に基づいて、自動的にコンパイラを選択します。

リリース固有のC 行列 APIまたはFortran 行列 APIをもつリンク。次の表のいずれかの値として指定します。これらのオプションを組み合わせないでください。

このオプションは、C++ 用の MATLAB データ APIを使用する MEX ファイルまたはエンジン アプリケーションに使用しないでください。

API説明

-R2017b (既定)

以下でビルドされます。

  • MATLAB R2017b 以前の C および Fortran 行列 API の機能が含まれている実数/虚数分離型複素数 API。

  • 要素数が 231-1 を超える配列を扱う大規模配列ハンドリング API。

  • グラフィックス オブジェクトのハンドルを double ではなく object として扱う。

MATLAB の将来のバージョンでは、既定の api オプションによってインターリーブされた複素数 API (-R2018a) を使用するように変更されます。MathWorks では、アプリケーションを作成して既存のアプリケーションを更新し、インターリーブされた複素数 API を使用することを推奨しています。あるいは、MX_HAS_INTERLEAVED_COMPLEX マクロを使用して、MATLAB の複数バージョンにわたって目的の動作を適用します。詳細については、MATLAB の MEX 関数におけるインターリーブされた複素数 API のサポートを参照してください。

-R2018a

以下でビルドされます。

R2018a で、インターリーブされた複素数 API によってビルドされた Fortran MEX ファイルを実行するには、R2018a Update 3 を使用しなければなりません。

-largeArrayDims

以下でビルドされます。

  • 実数/虚数分離型複素数 API

  • 大規模配列ハンドリング API

  • グラフィックス オブジェクトのハンドルを double ではなく object として扱う。ハンドルを double として扱うには、このオプションを -DMEX_DOUBLE_HANDLE と組み合わせます。

-compatibleArrayDims

以下でビルドされます。

  • 実数/虚数分離型複素数 API

  • 配列の要素数を 231-1 に制限する Version 7.2 の配列ハンドリング API

  • グラフィックス オブジェクトのハンドルを double ではなく object として扱う。ハンドルを double として扱うには、このオプションを -DMEX_DOUBLE_HANDLE と組み合わせます。

LAPACK 関数または BLAS 関数を呼び出す場合、-compatibleArrayDims オプションを使用しないでください。

C MEX S-Function のみで既定のオプション。

例: mex -R2018a explore.c

ビルド オプション (オプション)。次の表のいずれかの値として指定します。オプションは、指示がある場合を除き、任意のプラットフォームで任意の順序で指定できます。

オプション説明

@rspfile

Windows RSP ファイルを使用します。RSP ファイルは、コマンド ライン オプションを含むテキスト ファイルです。非 ASCII 文字はサポートされません。

-c

オブジェクト ファイルのみをコンパイルします。バイナリ MEX ファイルはビルドしません。

-client engine

エンジン アプリケーションをビルドします。

-Dsymbolname
-Dsymbolname=symbolvalue
-Usymbolname

-D オプションは、C プリプロセッサ マクロを定義します。ソース ファイル内での以下と等価です。

  • #define symbolname

  • #define symbolname symbolvalue

-U オプションは、C プリプロセッサ マクロ symbolname のすべての初期定義を削除します(-D オプションの逆)。

D または Usymbolname との間にスペースを追加しないでください。= 記号の前後にスペースを追加しないでください。

例: コンパイラ命令を定義

-f filepath

既定のコンパイラ選択をオーバーライドします。filepath は string または文字ベクトルとして指定される構成ファイルの名前および絶対パスです。既定以外のコンパイラの詳細については、既定のコンパイラの変更を参照してください。

-f オプションを使用してエンジン アプリケーションをビルドしないでください。代わりに -client engine オプションを使用してください。

-g

シンボル情報を追加し、ビルドされるオブジェクト コードの最適化を無効にします。デバッグに使用します。

-h[elp]

mex のヘルプを表示します。オペレーティング システムのプロンプトから使用します。

-Ipathname

#include ファイルを検索するフォルダーのリストへ pathname を追加します。

Ipathname の間にスペースを追加しないでください。

例: インクルード ファイルへのパスを指定する

-llibname
-Llibfolder -llibname

ダイナミック オブジェクト ライブラリ libname とリンクします。オプションでフォルダー libfolder を指定できます。

MATLAB は libname を以下のファイルに展開します。

  • libname.lib または liblibname.lib — Windows システム

  • liblibname.dylibmacOS システム

  • liblibname.so — Linux システム

使用する場合、-L オプションは -l オプションの前に置かなければなりません。Linux システムまたは macOS システムで -L オプションを使用する場合は、ランタイム ライブラリ パスの設定で説明されているとおり、ランタイム ライブラリのパスも設定しなければなりません。

-l オプションは小文字の L で指定します。llibname の間、または Llibfolder の間にスペースを追加しないでください。

スタティック ライブラリをリンクするには、入力引数 filenames を使用します。

例: ライブラリ ファイルへのパスを指定する

-n

mex が実行するコマンドを表示します。ただし、実行はしません。

例: ビルド コマンドをプレビューする

-O

オブジェクト コードを最適化します。最適化を使用してコンパイルするには、このオプションを使用します。最適化は既定で有効になっています。

このオプションは大文字の O で指定します。

-outdir dirname

すべての出力ファイルをフォルダー dirname へ保存します。

例: 個別のオブジェクト ファイルへのリンクを作成する

-output mexname

既定の MEX ファイル命名メカニズムをオーバーライドします。適切な MEX ファイル拡張子をもつ、mexname という名前のバイナリ MEX ファイルを作成します。

例: ワイルド カードを使用したソース ファイルの結合

-setup lang

lang 言語 MEX ファイルまたはエンジン アプリケーションをビルドするように、既定のコンパイラを変更します。このオプションを使用すると、mex はその他のコマンド ライン オプションをすべて無視します。

-silent

情報を伝えるメッセージを非表示にします。mex コマンドは、-silent が指定された場合でもエラーと警告をレポートします。

-Usymbolname

C プリプロセッサ マクロの symbolname のすべての初期定義を削除します(-D オプションの逆)。

Usymbolname の間にスペースを追加しないでください。

-v

詳細モードでビルドします。すべてのコマンド ライン引数が処理された後、内部変数の値を表示します。コンパイルおよびリンクの各ステップのすべての評価を表示します。コンパイラ設定の問題のトラブルシューティングに使用します。

例: ビルドとトラブルシューティングの詳細情報の表示

varname=varvalue

環境変数 varname に値を追加します。コマンド ライン引数がすべて処理された後に、このオプションが処理されます。

例:

言語。次の値のいずれか (大文字小文字は区別されない) として指定します。

C

C コンパイラ (C++ を含む)

C++ または CPP

C++ コンパイラ

Fortran

Fortran コンパイラ

ヒント

  • mex は以下の場所から実行できます。

    • MATLAB コマンド ウィンドウ

    • Windows システム プロンプト

    • macOS ターミナル

    • Linux シェル

    MATLAB 以外のコマンド ラインで使用する場合、mex プログラムは、UNIX の [matlabroot '/bin'] および Windows の [matlabroot '\bin\win64'] で指定されたフォルダーに格納されています。

  • MEX ファイルの拡張子はプラットフォームによって異なります。さまざまなプラットフォーム用のバイナリ MEX ファイルを同じフォルダーに配置できます。MEX ファイルの拡張子を識別するには、関数 mexext を使用してください。

    MEX ファイルのプラットフォーム依存の拡張子

    プラットフォームバイナリ MEX ファイルの拡張子

    Windows

    mexw64

    Linux

    mexa64

    Apple シリコン搭載の macOS

    mexmaca64

    Intel® 搭載の macOS

    mexmaci64

    メモ

    Intel を搭載した macOS でビルドされた MEX ファイルは、Rosetta 2 を使用する Apple シリコン プラットフォームではサポートされていません。

  • mex を使用してスタンドアロンの MATLAB エンジン アプリケーションの実行可能ファイルをビルドするには、-client engine オプションを使用してください。

  • mex コマンドは、二重引用符 (") を含むフォルダー名をサポートしません。

バージョン履歴

R2006a より前に導入

すべて展開する