web-dev-qa-db-ja.com

Visual Studioでmexファイルを直接ビルドする方法は?

関数のライブラリを含むVisual Studio 2010ソリューションがあり、MATLABをこのライブラリのいくつかの可能なフロントエンドの1つとして使用できるようにしたいと考えています。したがって、ソリューションをビルドするときにVisual Studioでmexファイルを自動的に生成し、ビルドオプションとパスをmexopts.batにエクスポートして、そこからファイルをビルドするためにMATLABを開く必要はありません。私は同様のことを達成するためにいくつかの提案を見てきました、例えばこれらの投稿で:

Matlab 7.1以降およびVisual Studio 2005

Visual Studioを使用したMEXファイルのコンパイル

CMakeおよびVisual Studio 2010(64ビット)を使用してMATLAB R2011a(64ビット)mexファイルをビルドする方法

ただし、それらは少し古くなっているように見える(参照されなくなったファイルを参照している)か、外部ツール(CMakeなど)を利用しています。最新のMATLABリリース用のmexファイルをビルドするVisual Studio(2010以降)で(既存のソリューション内に)新しいプロジェクトを設定する方法を知っている人はいますか?

17
j0rre

質問で言及された このページ からのガイダンスを試してみたところ、空のC++プロジェクトから始めて、プロジェクトのプロパティページの次の設定が必要であり、Visual Studioから動作する.mexw64を構築するのに十分であるようです2010:

構成プロパティ->全般:
ターゲット拡張子を.mexw64に設定
構成タイプをダイナミックライブラリ(.dll)に設定
 
構成ポップアップ- > VC++ディレクトリ:
 $(MATLAB_ROOT)\ extern\includeを追加します。ディレクトリを含める方法
 
構成プロパティ->リンカー->一般:
 $(MATLAB_ROOT)\ extern\lib\win64\Microsoft;を追加します。追加のライブラリディレクトリへ
 
構成プロパティ->リンカ->入力:
 libmx.lib; libmex.lib; libmat.lib;を追加します。追加の依存関係
 
構成プロパティ->リンカー->コマンドライン:
/export:mexFunctionを追加のオプションに追加

$(MATLAB_ROOT)は、Matlabのルートフォルダーへのパスです。 C:\ Program Files\MATLAB\R2013a。

これまでのところ、これはゼロから作成され、Matlab 2013a 64ビット用に構築されたソリューションからのみ試されています。 32ビット用にビルドするには、64と32の両方を変更するだけでよいと思います。これが既存のソリューションで機能することを確認したら、投稿を更新します。

EDIT:予想どおり、これは既存のソリューションに追加されたプロジェクトで機能します。新しいプロジェクトがライブラリを作成するプロジェクトに依存するように設定することを忘れないでください。

編集2:以下 この質問 上記の手順がVisual Studio 2012、2013、2017でも機能することを確認できます。

28
j0rre

プロパティシートを使用してMEXファイル用のVisual Studioプロジェクトをすばやく設定する

すべての設定は、Visual Studioプロジェクト構成を迅速に適用するためのメカニズムであるプロパティシートを介して適用できます。

手順:

  1. プロパティシート(MATLAB.props)を this GitHib repo からダウンロードします。短くて甘いです。プロセスに何が関係しているかを学ぶために自分で作ることを実際に強く勧めます。詳細については、以下のプロパティシートの詳細セクションを参照してください。
  2. MATLABルート環境変数を設定します。64ビットのMATLABインストールの場合は_MATLAB_ROOT_、32ビットのMATLABインストールの場合は_MATLAB32_ROOT_(例:_C:\Program Files\MATLAB\R2014b\_)。このフォルダには、bin、extern、sysなどのサブディレクトリがあります。VSが開いている場合は、VSを再起動します。
  3. Visual Studioで空のDLLプロジェクトを作成し、オプションでx64ソリューションプラットフォームを作成します。これを行うには、次のように「Win32プロジェクト」を選択し、DLLを選択します。

enter image description here

  1. [プロパティマネージャー]([表示]メニューから選択)で、各プロジェクトのビルド構成を右クリックして "既存のプロパティシートを追加..." を選択し、適切なプロパティシート(32または64)を選択します。ビット)。 (下のスクリーンショットを参照)

enter image description here

それでおしまい!

MATLABを使用してMEXファイルを使用し、Visual Studioを使用して新しいバージョンをビルドする場合、それを上書きできるように_clear mex_または_clear specificMEXFileName_を実行する必要があることに注意してください。ほとんどすべてのMEXファイルをこの方法でビルドします。

UPDATE(05/22/15):ファイル MATLAB.props は、mxGPUArrayオブジェクト。マシンにツールボックスパスとライブラリ(gpu.lib)が存在する場合は、それらを使用できます。 CUDA SDKの「ビルドのカスタマイズ」(CUDA SDKをインストールしてVisual Studio統合をインストールした場合にインストールする必要があります)を含めてcuda_runtime.hなどを含めます。最後に、cudart_static.libとリンクします(ただし、継承します。オンにすると、他のリンカーエラーが発生します)。


プロパティシートの詳細

プロパティシートには重要な設定がいくつかあります。

  1. $(MATLAB_ROOT)\extern\includeAdditionalIncludeDirectoriesパスに追加します(親構成から継承されたパスを使用)-mex.hの場所。
  2. $(MATLAB_ROOT)\extern\lib\win64\MicrosoftAdditionalLibraryDirectoriesパスに追加-libmex.libの場所など.
  3. ライブラリーのリスト:_libut.lib;libmx.lib;libmex.lib;libmat.lib_。
  4. mexFunctionをエクスポートしています(共有ライブラリです):_/EXPORT:mexFunction_。
  5. 出力ファイルの拡張子を設定する(例:_.mexw64_ for x64)。

不要ですが、ライブラリに埋め込まれていない出力マニフェストも指定し、_MATLAB_MEX_FILE_を設定して、プロファイリングに必要なデータの生成をオンにします。

完全を期すために、プロパティシートを含む、プロジェクト構成用のより正式な " ビルド構成 "システムがありますが、単純なMEXプロジェクトを設定するには緩いプロパティシートで十分です。


_-largeArrayDims_に関する注意

_-largeArrayDims_オプションは、MATLABのmexコマンドへのスイッチであり、単に定義しない _MX_COMPAT_32_を示します。したがって、Visual Studioでは、これはデフォルトで定義されていないため、何もする必要はありません。逆の動作(_-compatibleArrayDims_)が必要な場合は、プリプロセッサセクションで_MX_COMPAT_32_を定義します。


libut.libは何のためのものですか?

Libut.libを含めます。これは、MEXファイル内からブレーク(CTRL-C)を検出するためのいくつかの素晴らしい関数を提供します。関連する宣言(これは話題から外れていますが):

_// prototype the break handling functions in libut (C library)
extern "C" bool utIsInterruptPending();
extern "C" void utSetInterruptPending(bool);
_
12
chappjc

ビルド/リンク/コンパイルのために、拡張機能またはマクロを使用してVisual Studioを自動化します

  1. シンMatlabクライアントを起動します(-nojvm -noawt -nodesktop -nosplashコマンドラインオプションを使用します。これは私のマシンで1秒未満で起動します)。
  2. mex(他の依存関係などを含む)を呼び出してバイナリを生成します。
  3. デバッグがアクティブになっている場合は、Visual Studioデバッガーを新しく起動したシンMATLABクライアントに接続します(VSでクリックしたブレークポイントはすべてアクティブになります)。

Visual Studio 2010でこれを自動化しました。このようにして、Visual Studio IDEからmexラッパーを完全に操作し、デバッグ用の4つの追加プッシュボタンがあります。コンパイルエラーは、Visual Studio内ではなく、MATLABターミナルウィンドウからエコーされます。ここにアップロードされたマクロを見つけます:

http://www.mathworks.se/matlabcentral/fileexchange/39549-visual-studio-toolbar-for-mex-interface-with-video-tutorial

1
Stefan Karlsson