web-dev-qa-db-ja.com

MATLABのMEXコンパイラとしてGCC(MinGW)を使用する

MATLAB R2011aで実行するプロジェクトが与えられました。そこにはいくつかの.cファイルがあるので、GCCをそのプロジェクトのMEXコンパイラとして設定する必要があります。ただし、設定方法については説明がありません。 gnumexというスクリプトプログラムを試しましたが、失敗しました(おそらく古いバージョンのMATLAB用にセットアップされています)。

それを設定する方法はありますか?

20
Menyh

Matlab 2011bでは、mingw64またはcygwin環境で直接コンパイルしてリンクするだけです。

MINGWPATH=c:/MinGW64
CYGPATH=c:/cygwin

MATLABROOT=c:/Progra~1/MATLAB/R2011b
CC=$(MINGWPATH)/bin/x86_64-w64-mingw32-gcc 
CFLAG= -Wall -m64 -O3 -I$(MATLABROOT)/extern/include $(SRC) $(LIBS) -o $(EXE)
MEXFLAG=-m64 -shared -DMATLAB_MEX_FILE -I$(MATLABROOT)/extern/include -Wl,--export-all-symbols $(LIBS) $(MEXSRC) -o $(MEXTGT).mexw64

LIBS= -L$(MATLABROOT)/bin/win64 -L$(MATLABROOT)/extern/lib/win64/Microsoft -lmex -lmx -lmwlapack -lmwblas -leng
EXE=../bin/engwindemo.exe
MEXTGT=
SRC=engwindemo.c
MEXSRC=
all:$(EXE)

$(EXE):  $(SRC)
    $(CC) $(CFLAG) -ladvapi32 -luser32 -lgdi32 -lkernel32 -lmingwex -o $(EXE)
    @rm -f *.o*

$(MEXTGT):  $(MEXSRC)
    $(CC) $(MEXFLAG) -ladvapi32 -luser32 -lgdi32 -lkernel32 -lmingwex 
    @rm -f *.o*

このメイクファイルをソースコードディレクトリとmakeに配置します。 DLLファイルの変換は必要ありません。

14

ディレクトリ内のmexopts.batファイルを調整してみませんか?そうすれば、「mex」コマンドを透過的に使用して、MATLABでmex -setupを使用して設定された場合と同じように、MATLABで通常どおり何でもコンパイルできます。誰もこれをやったことがないのには驚いた。

以下のファイルは、MatlabおよびMingwのx64バージョン用です。 p:\mingw64-tdmにインストールした TDM Mingw64 ディストリビューションを使用しています。 Matlabをp:\matlab\R2012aにインストールしました-それらを適宜編集します。

これは私が使用しているmexopts.batファイルです。コピーして%USERPROFILE%\AppData\Roaming\MathWorks\MATLAB\R2012a\mexopts.batに貼り付けます:

@echo off

set MINGWPATH=p:\mingw64-tdm
set PATH=%MINGWPATH%\bin;%PATH%

set COMPILER=gcc
set COMPFLAGS=-c -m64 -I"%MATLAB%\extern\include" -DMATLAB_MEX_FILE -Wall -std=c99
set OPTIMFLAGS=-O3 -DNDEBUG
set DEBUGFLAGS=-g
set NAME_OBJECT=-o

set LINKER=gcc
set LINKFLAGS=-shared -L"%MATLAB%\bin\win64" -L"%MATLAB%\extern\lib\win64\Microsoft" -lmex -lmx -leng -lmat -lmwlapack -lmwblas
set NAME_OUTPUT=-o "%OUTDIR%%MEX_NAME%%MEX_EXT%"

次に、Matlabでこれを試してみてください:

mex -v p:\matlab\R2012a\extern\examples\mex\yprime.c
which yprime

b:\code\m\yprime.mexw64(または現在のフォルダーが何であれ)を生成する必要があります。その後、あなたがするなら:

yprime(1,1:4)

見るべき:

ans =
    2.0000    8.9685    4.0000   -1.0947

それはあなたがビジネスをしていることを意味します。幸運を!

EDIT 2014年10月:私は今、異なるMinGW64で上記よりも改善されたmexopts.batファイルを使用しています(TDMよりもわずかに速いバイナリコードを生成します)。詳細およびダウンロードについては、 私のホームページ を参照してください。

13
Bogdan

MATLAB R2015b現在、MinGWは公式にサポートされています!

現在、 サポートされているコンパイラのリスト の先頭にあります。

MinGWのダウンロードについては、 公式の手順についてはこちら を参照してください(TDB-GCCを推奨しています)。

リストされているいくつかの制限と警告 があります(たとえば、他のコンパイラでコンパイルされたライブラリとリンクしない、MEXファイル内の例外をキャッチするなど)。

以下は、同じことを行うためにXMLファイルを作成する私の古い方法です。


年が経ち、MATLAB(R2014a現在)は、MEXファイルを構成するための新しいXMLベースのシステムに移行しました。現在のところ、MATLABは従来の.batファイルを一時的にサポートしていますが、 他のユーザー をサポートします。もう1つの変更点は、CおよびC++の個別の構成です(詳細)。

同じままであるのは、MinGWディストリビューションをダウンロードして抽出し、MATLABをポイントするだけです。 stillMSYS、cygwin、またはgnumexは必要ありません。唯一のトリッキーな部分は、MATLABを指すことですが、ここに解決策があります。

ショートバージョン

  • MinGWディストリビューションをダウンロードして抽出します。 MinGW-w64 (64ビット)または TDM-GCC (32ビットおよび64ビットオプション)などのいずれかを選択します。
  • this one をテンプレートとして使用して、XML構成ファイルをカスタマイズします(詳細は以下の長いバージョンを参照)。
  • MINGWROOT環境変数を設定します。
  • mex -setup:[xmlfile] [C|C++]を実行します。

ロングバージョン

MinGW-w64の場合、以下を実行して設定します。

  1. Sourceforgeのw64の最新リビジョン (または インストーラー を使用して必要なツールチェーンを選択し、必要に応じてpthreadまたはWin32スレッドバージョンを選択します)を取得します。
  2. C:\mingw-w64\x86_64-4.9.2-release-posix-seh-rt_v3-rev1\bin\x86_64-w64-mingw32-g++.exeのようなコンパイラーへのパスがあるようにそれを抽出します。 mexコマンドを使用してMATLABでコンパイルする場合、MSYS、cygwin、またはその他の環境は必要ありません。 PATH環境変数をチェックして、パス上に複数のコンパイラ(g++)がないこと、できればコンパイラがないことを確認してください。新しいコマンドプロンプトで確認します。
  3. カスタムXML構成ファイルを使用してセットアップします。 GitHubリポジトリに、MinGW-w64のC++構成を両方のファイルタイプで掲載しました: mex_C++ _ mingw-w64.xml およびlegacy mingw_mexopts.bat 。それをテンプレートとして開始し、(オプション)ダウンロードして抽出したMinGWディストリビューションの説明的な名前とバージョンでXMLファイルを編集します。
  4. MINGWROOT環境変数を設定(または作成)します。これにより、mexコマンドでコンパイラを見つけることができます。これは、MATLAB(およびevery timeMATLABはuserpathstartup.mスクリプトで開始します) setenv 、または Windowsプロパティダイアログ またはネイティブWindows 7 setx.exeコマンド で1回だけ。
  5. mex -setup:C:\actual\configFilePath.xml C++を実行します。たとえば、.xmlファイルを使用してC++ MEXファイルのコンパイルを設定する場合:

    setenv('MINGWROOT','H:\mingw-w64\x86_64-4.9.2-release-posix-seh-rt_v3-rev1')
    mex -setup:H:\building\GitHub\MATLAB\MinGW\mex_C++_mingw-w64.xml C++
    

    出力は次のようになります。

    C++言語のコンパイルに 'MinGW-w64 GCC 4.9.2 posixthreads seh'を使用するように構成されたMEX。

必要に応じて、C言語を指定する新しいXML構成ファイル、Cコンパイラフロントエンド(たとえば、C++標準ライブラリを自動的にリンクしない「x86_64-w64-mingw32-gcc.exe」)を使用して、Cコンパイラを同様にセットアップします。 )、必要に応じてリンクライブラリを調整し、コンパイラフラグ(たとえば、-std=c++11-std=c99に変更)など。


ランタイムライブラリの静的リンクと動的リンクに関する注意事項

上記のMinGW-w64で作成されたMEXファイルなどのライブラリは、いくつかのDLL(実行時)に依存する場合があります。 Win32スレッドの代わりにpthreadsディストリビューションを選択した場合。これらのファイルをコピーしたくない場合は、次のスイッチを追加してランタイムライブラリをMEXファイルに静的にリンクできます。

-static-libgcc -static-libstdc++

これについて、XMLテンプレートにコメントがあります。 libpthread-1.dllについては here をご覧ください。

TDM-GCCでは、- その逆 :ランタイム(pthreadを含む)は静的に自動的にリンクされます。 DLLを必要とするが、MEXファイルサイズを削減する動的にリンクするには、以下が必要です。

-shared-libgcc -shared-libstdc++
8
chappjc

編集:MinGWにはもっと良い方法があるようです。私の他の答えを参照してください。

コマンドラインからgccがインストールされている場合、Matlabを使用して_.mex_ファイルをコンパイルできます。最初は少し退屈だと言う人もいるかもしれません。

まず最初に-Matlabは何を使用しますか? 64ビットの場合、MinGWは32ビットなので、役に立ちません。したがって、代わりに MinGW-w64 を使用する方法を示します。 32ビットMinGWでこれを行う方法を理解するのは簡単です。

  1. _C:\MinGW-64\bin\_をパスに追加します。これを後悔することはありません:)
  2. gccを使用して_.c_ファイルをコンパイルします。

    _x86_64-w64-mingw32-c++ -m64 -shared -I"C:\Program Files\MATLAB\R2010b\extern\include" -o bla.mexw64 -DMATLAB_MEX_FILE -Wl,--export-all-symbols *.cpp
    _
  3. これにより、次のようなリンカエラーが大量に発生します。

    _undefined reference to `mexErrMsgTxt'
    _

    この問題を解決するには、_libmex.dll_、_libmx.dll_、_libmat.dll_、および_libeng.dll_と接続するインポートライブラリを作成する必要があります(他にもあるかもしれませんが、これらは主なもの)

  4. 不足している関数をリストし、それらがどのdllから来ているかを推測します。ヒント:mexErrMsgTxtは_libmex.dll_からのものです。「mex」で始まるためです...

  5. エクスポートする必要があるdllごとに、次を含む_.def_ファイルを作成します

    _EXPORTS
    ... relevant function names go here, such as mexErrMsgTxt, matOpen, etc.
    _
  6. 次のコマンドを実行して、インポートライブラリを作成します。

    _x86_64-w64-mingw32-dlltool -d libmx.def --dllname libmx.dll -l libmx.a
    _

    (残りの_.def_ファイルも同じです)

  7. これで準備完了です!

    _x86_64-w64-mingw32-c++ -m64 -shared -I"C:\..." -DMATLAB_MEX_FILE -o bla.mexw64 -Wl,--export-all-symbols *.cpp libmex.a libmx.a libmat.a libeng.a
    _

よりよい方法-_--export-all-symbol_の代わりに、mexFunctionのみをエクスポートします(別の_.def_ファイルを作成するか、__declspec(dllexport)の前に「void mexFunction(...)」を追加する必要があります])。

6
user1071136

MinGWDLLを直接リンク ;に対応しています。つまり、リンク時にその場で一種のインポートライブラリを作成します。

つまり、コンパイルは1ステップで実行できます。

x86_64-w64-mingw32-c++ -m64 -shared -I"%MATLAB%/extern/include" -DMATLAB_MEX_FILE -o bla.mexw64 -Wl,--export-all-symbols *.cpp -L"%MATLAB%/bin/win64" -lmex -lmx -leng -lmat
3
user1071136

なぜこれほど多くのステップがあるのですか? Matlab 2016以降をお持ちの場合は、次のようにします:

  1. mingw をダウンロードして、スペースのないフォルダーにインストールします(つまり、「Program Files」にはインストールしません)
  2. MW_MINGW64_LOCインストールフォルダーを指す環境変数(インストーラーに入力したものとまったく同じ)
  3. PCを再起動してください
  4. MATLABを開き、mex -setupコンソールに。 「MinGWを使用するように構成されています」と表示されるはずです。
  5. MATLABプログラムの実行/コンパイル

新しいWindows 10 PCでこれらをテストしましたが、動作します!

1
Robinicks

Matlabは、MEXファイルを使用した外部コード(C++、Fortran、Javaなど)へのリンク。( http://gnumex.sourceforge.net/ ))

コンパイラーのセットアップ:

  1. インストールTDM-GCC(C++コンパイラ"C:\MinGW32\bin;")from http://tdm-gcc.tdragon.net/download
  2. http://ptolemy.eecs.berkeley.eduからCygwin(ツールキットはWindowsプラットフォームでUnixツールを提供)をインストールします/ptolemyII/ptII4.0/cygwin.htm )。
    cygwingDevel.exeをダウンロードしてインストールします
  3. gnumexアーカイブを( https://sourceforge.net/projects/gnumex )経由で取得し、抽出します($MATLABHOME\gnumex)へのgnumex。
    $MATLABHOMEの例(C:\Program Files\MATLAB\R2010a
  4. このディレクトリ($MATLABHOME\gnumex)をMatlabパス(MatlabのFile->Set Path)に追加します。
    注:管理者権限でMatlabを実行します。
  5. Matlabでは、プロンプトでgnumexと入力します。次のような適切なパスを入力します。

    MinGW_Root = C:\ MinGW32、Cygwin_Root = C:\ cygwin

  6. File->Save Config」を実行し、「Make Options file」をクリックします。 gnumex設定ウィンドウを終了します。

テスト:

このテストのために、mexopts.bat%AppData%\MathWorks\MATLAB\R2010a\mexopts.bat)を作業ディレクトリ(%UserProfile%\Documents\MATLAB)にコピーします。

  1. Matlabでは、プロンプトで次を実行します。

    mex -f mexopts.bat "C:\ Program Files\MATLAB\R2010a\extern\examples\mex\yprime.c"

  2. 入力すると(%UserProfile%\Documents\MATLAB\yprime.mexw32)が得られます。

    どのyprime

  3. Matlabプロンプト>> yprime(1,1:4)に入力して実行し、2.0000 8.9685 4.0000 -1.0947が表示されるかどうかを確認します。

  4. mexopts.bat$MATLABHOME\binにコピーするだけで、どこからでも動作するはずです。

Linuxプラットフォーム上のMatlab:

  1. Linuxプロンプトで、次をインストールします。

    Sudo apt-get install gcc g ++ gfortran

  2. Matlabでは、プロンプトで次を実行します。

    mex -setup

  3. Mexで使用できるオプションファイルは次のとおりです。**1**: /usr/local/MATLAB/R2012b/bin/mexopts.sh:オプション1を選択します。動作をテストするには、Matlabプロンプトで次を実行します。

    mex "/usr/local/MATLAB/R2012b/extern/examples/mex/yprime.c"

    yprime(1,1:4)

警告が表示された場合;

Warning: You are using gcc version "4.6.3-1ubuntu5)".  The version
         currently supported with MEX is "4.4.6".
         For a list of currently supported compilers see: 
         http://www.mathworks.com/support/compilers/current_release/

Linuxプロンプトで:

  1. Sudo apt-get install gcc-4.4 g++-4.4 gfortran-4.4
  2. Sudo gedit /usr/local/MATLAB/R2012b/bin/mexopts.sh
  3. 'gcc''gcc-4.4''g++'のすべてのインスタンスで、'g++-4.4''gfortran''gfortran-4.4'CC = 'gcc'CXX = 'g++'FC = 'gfortran'に変更します。
  4. ファイルを保存して終了します。
1
Faheem

これは this answer の詳細なウォークスルーです。したがって、すべてのクレジットは その答え に移動する必要があります。

1 MinGW-w64をインストールします。

1.1このMinGW64-w64ビルドとその更新をダウンロードします。

http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/sezero_4.5_20111101/mingw-w64-bin_x86_64-mingw_20111101_sezero.Zip/download

http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/sezero_4.5_20111101/sezero_20111101-w64-update-rev.5747.Zip/download =)

http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/sezero_4.5_20111101/README-mingw-w64-20111101_sezero.txt/download

1.2ダウンロードしたアーカイブをインストール(解凍)します:

1.2.1ビルドファイルを解凍し、結果のmingw64\フォルダーをc:\に移動します

1.2.2 c:\mingw64の更新ファイルを解凍してコピー(上書き)します

1.3 C:\mingw64\binをPath変数に追加します。

set PATH=C:\mingw64\bin;%PATH%

2コマンドライン(Matlab環境外)で、*。cファイルをコンパイルします。たとえば、CCODEFILE.cC:\Program Files\MATLAB\R2012b\フォルダーにインストールされたMatlab 2012bを想定):

"c:\mingw64\bin\x86_64-w64-mingw32-g++.exe" -m64 -shared -I"C:/Program Files/MATLAB/R2012b/extern/include" -DMATLAB_MEX_FILE -o CCODEFILE.mexw64 -Wl,--export-all-symbols CCODEFILE.c -L"C:/Program Files/MATLAB/R2012b/bin/win64" -lmex -lmx -leng -lmat

3その後、MatlabコードはCCODEFILE関数を呼び出すときに正常に動作するはずです。

1
imriss

Matlab2016b on Windowsのアドオンツールバーを使用してMingw-w64をインストールできなかった場合、この回避策を使用できます。インストールパスに応じてパスを変更する必要があることに注意してください。

  1. Mingw-w64 公式Webサイトは、オープンソース開発ツールのバンドルのパッケージマネージャーである Win-builds プロジェクトにリダイレクトします。そのため、最初にWinビルドをインストールする必要があります。
  2. Win-buildのインストール中に、スペースを含まない パスを入力していることを確認してください/ _C:\Win-builds_。
  3. Win-buildをインストールしたら、Processボタンを押して、Mingw-w64が含まれるすべてのパッケージをインストールします。
  4. Mingw-w64をインストールしたので、 MatlabがMingw-w64 の検出に使用する_MW_MINGW64_LOC_環境変数を定義する必要があります。
  5. 環境変数を定義するには、次の手順を実行します。

    コントロールパネル\システム\システムの詳細設定\詳細\環境変数\ $ YOUR_USER_NAMEのユーザー変数\新規

  6. _Variable name = MW_MINGW64_LOC_と_Variable value = C:\Win-builds_を入れます。 Win-buildはすべての実行可能ファイルを_C:\Win-builds\bin_に配置し、この変数を定義することにより、Matlabは_gcc.exe_を探すパスのbinフォルダーを自動的にスキャンします。
  7. Mingw-w64をインストールし、_MW_MINGW64_LOC_環境変数を定義したので、 yprime example をビルドしてテストします。そのため、Matlabを起動し、次のコマンドを入力します(それに応じてパスを変更することを忘れないでください)。

    mex -v 'C:\ Program Files\MATLAB\R2016b\extern\examples\mex\yprime.c'

  8. インストールが成功すると、次のメッセージが表示されます。

    MEXは正常に完了しました。

  9. 最後に、yprime(1,1:4)と入力してインストールをテストできます。答えは次のとおりです。

    ans = 2.0000 8.9685 4.0000 -1.0947

1
hmofrad

R2011aを搭載したWindows 64ビットでは、 http://tdm-gcc.tdragon.net/ および http://gnumex.sourceforge.net/ で動作しましたが、変化する maxopt.bat行エントリGM_ADD_LIBS 次のように:

rem Add path to where dlls are:

set DLL_PATH="C:\Program Files\MATLAB\R2011a\bin\win64"

rem Add every dll needed:

set GM_ADD_LIBS=%DLL_PATH%\libmx.dll %DLL_PATH%\libmex.dll %DLL_PATH%\libmat.dll 

幸運なことに、この時点に至るまでに長い時間がかかりました。

0
rarias

もともとこれは拷問のようなものだと思っていましたが、@ user10171136による上記の回答に基づいて、Fedora LinuxからWindows mex向けにクロスコンパイルするのは非常に簡単であることがわかりました。 Fedoraにはmingwおよびmingw64パッケージがあります。

  1. Sudo yum install mingw64-gcc mingw64-gcc-c++
  2. Windows Matlabからコピーすると、extern/includebin/win64の両方のディレクトリがインストールされます(実際には、ヘッダーのサブセットとdllの小さなサブセットのみが必要です。libmat.dll libmex.dll libmx.dllだけで十分です。 。これら2つのディレクトリを既存のLinux MATLABディレクトリの下の新しいR2010a-w64ディレクトリに配置し、Windowsヘッダーとlibを隠した場所に応じて以下のコマンドを変更します。
  3. char16_tにはmatrix.hが必要であり、定義されていなかったという問題が1つありました。 matrix.huchar.hを含めるのを忘れていたと思いますか?私は-includeディレクティブを回避しました。下記参照。
  4. x86_64-w64-mingw32-gcc -m64 -shared -include uchar.h -I/opt/MATLAB/R2010a-w64/extern/include -DMATLAB_MEX_FILE -L/opt/MATLAB/R2010a-w64/bin/win64 -o bla.mexw64 bla.c -lmx -lmex
  5. (リンク用に追加のライブラリが必要になる場合があります(例:-lmat -leng -lmなど))
  6. これにより、セットアップ用にWindows Matlabで実行可能なmexファイルが正常に生成されます。これまでのところ、これは非常に単純なCプログラムでのみテストしました。

これが理にかなっているかどうかを聞いて興味があります。クロスコンパイルの経験はあまりありません。

0
Chinasaur

これは、Windows 8のMatlab 2012bで動作します。

https://github.com/DynareTeam/dynare/blob/master/windows/mexopts-win64.bat

Cgwinディレクトリを変更するか、使用されている場合はmingwディレクトリに置き換えます。 64ビットバージョンに切り替えると、compiler-exeを変更することもできます。

0
pete