MATLAB R2011aで実行するプロジェクトが与えられました。そこにはいくつかの.cファイルがあるので、GCCをそのプロジェクトのMEXコンパイラとして設定する必要があります。ただし、設定方法については説明がありません。 gnumexというスクリプトプログラムを試しましたが、失敗しました(おそらく古いバージョンのMATLAB用にセットアップされています)。
それを設定する方法はありますか?
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ファイルの変換は必要ありません。
ディレクトリ内の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よりもわずかに速いバイナリコードを生成します)。詳細およびダウンロードについては、 私のホームページ を参照してください。
現在、 サポートされているコンパイラのリスト の先頭にあります。
MinGWのダウンロードについては、 公式の手順についてはこちら を参照してください(TDB-GCCを推奨しています)。
リストされているいくつかの制限と警告 があります(たとえば、他のコンパイラでコンパイルされたライブラリとリンクしない、MEXファイル内の例外をキャッチするなど)。
以下は、同じことを行うためにXMLファイルを作成する私の古い方法です。
年が経ち、MATLAB(R2014a現在)は、MEXファイルを構成するための新しいXMLベースのシステムに移行しました。現在のところ、MATLABは従来の.batファイルを一時的にサポートしていますが、 他のユーザー をサポートします。もう1つの変更点は、CおよびC++の個別の構成です(詳細)。
同じままであるのは、MinGWディストリビューションをダウンロードして抽出し、MATLABをポイントするだけです。 stillMSYS、cygwin、またはgnumexは必要ありません。唯一のトリッキーな部分は、MATLABを指すことですが、ここに解決策があります。
ショートバージョン
MINGWROOT
環境変数を設定します。mex -setup:[xmlfile] [C|C++]
を実行します。ロングバージョン
MinGW-w64の場合、以下を実行して設定します。
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++
)がないこと、できればコンパイラがないことを確認してください。新しいコマンドプロンプトで確認します。MINGWROOT
環境変数を設定(または作成)します。これにより、mex
コマンドでコンパイラを見つけることができます。これは、MATLAB(およびevery timeMATLABはuserpath
のstartup.m
スクリプトで開始します) setenv
、または Windowsプロパティダイアログ またはネイティブWindows 7 setx.exeコマンド で1回だけ。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++
編集:MinGWにはもっと良い方法があるようです。私の他の答えを参照してください。
コマンドラインからgcc
がインストールされている場合、Matlab
を使用して_.mex
_ファイルをコンパイルできます。最初は少し退屈だと言う人もいるかもしれません。
まず最初に-Matlabは何を使用しますか? 64ビットの場合、MinGW
は32ビットなので、役に立ちません。したがって、代わりに MinGW-w64 を使用する方法を示します。 32ビットMinGW
でこれを行う方法を理解するのは簡単です。
C:\MinGW-64\bin\
_をパスに追加します。これを後悔することはありません:)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
_
これにより、次のようなリンカエラーが大量に発生します。
_undefined reference to `mexErrMsgTxt'
_
この問題を解決するには、_libmex.dll
_、_libmx.dll
_、_libmat.dll
_、および_libeng.dll
_と接続するインポートライブラリを作成する必要があります(他にもあるかもしれませんが、これらは主なもの)
不足している関数をリストし、それらがどのdll
から来ているかを推測します。ヒント:mexErrMsgTxt
は_libmex.dll
_からのものです。「mex」で始まるためです...
エクスポートする必要があるdll
ごとに、次を含む_.def
_ファイルを作成します
_EXPORTS
... relevant function names go here, such as mexErrMsgTxt, matOpen, etc.
_
次のコマンドを実行して、インポートライブラリを作成します。
_x86_64-w64-mingw32-dlltool -d libmx.def --dllname libmx.dll -l libmx.a
_
(残りの_.def
_ファイルも同じです)
これで準備完了です!
_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(...)
」を追加する必要があります])。
MinGW
は DLL
を直接リンク ;に対応しています。つまり、リンク時にその場で一種のインポートライブラリを作成します。
つまり、コンパイルは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
なぜこれほど多くのステップがあるのですか? Matlab 2016以降をお持ちの場合は、次のようにします:
MW_MINGW64_LOC
インストールフォルダーを指す環境変数(インストーラーに入力したものとまったく同じ)mex -setup
コンソールに。 「MinGWを使用するように構成されています」と表示されるはずです。新しいWindows 10 PCでこれらをテストしましたが、動作します!
Matlabは、MEXファイルを使用した外部コード(C++、Fortran、Javaなど)へのリンク。( http://gnumex.sourceforge.net/ ))
"C:\MinGW32\bin;"
)from http://tdm-gcc.tdragon.net/downloadcygwingDevel.exe
をダウンロードしてインストールします$MATLABHOME\gnumex
)へのgnumex。$MATLABHOME
の例(C:\Program Files\MATLAB\R2010a
)$MATLABHOME\gnumex
)をMatlabパス(MatlabのFile->Set Path
)に追加します。Matlabでは、プロンプトでgnumex
と入力します。次のような適切なパスを入力します。
MinGW_Root = C:\ MinGW32、Cygwin_Root = C:\ cygwin
「File->Save Config
」を実行し、「Make Options file
」をクリックします。 gnumex設定ウィンドウを終了します。
このテストのために、mexopts.bat(%AppData%\MathWorks\MATLAB\R2010a\mexopts.bat
)を作業ディレクトリ(%UserProfile%\Documents\MATLAB
)にコピーします。
Matlabでは、プロンプトで次を実行します。
mex -f mexopts.bat "C:\ Program Files\MATLAB\R2010a\extern\examples\mex\yprime.c"
入力すると(%UserProfile%\Documents\MATLAB\yprime.mexw32
)が得られます。
どのyprime
Matlabプロンプト>> yprime(1,1:4)
に入力して実行し、2.0000 8.9685 4.0000 -1.0947
が表示されるかどうかを確認します。
$MATLABHOME\bin
にコピーするだけで、どこからでも動作するはずです。Linuxプロンプトで、次をインストールします。
Sudo apt-get install gcc g ++ gfortran
Matlabでは、プロンプトで次を実行します。
mex -setup
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プロンプトで:
Sudo apt-get install gcc-4.4 g++-4.4 gfortran-4.4
Sudo gedit /usr/local/MATLAB/R2012b/bin/mexopts.sh
'gcc'
、'gcc-4.4'
、'g++'
のすべてのインスタンスで、'g++-4.4'
を'gfortran'
、'gfortran-4.4'
にCC = 'gcc'
、CXX = 'g++'
にFC = 'gfortran'
に変更します。これは this answer の詳細なウォークスルーです。したがって、すべてのクレジットは その答え に移動する必要があります。
1 MinGW-w64をインストールします。
1.1このMinGW64-w64ビルドとその更新をダウンロードします。
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.c
(C:\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
関数を呼び出すときに正常に動作するはずです。
Matlab2016b on Windowsのアドオンツールバーを使用してMingw-w64をインストールできなかった場合、この回避策を使用できます。インストールパスに応じてパスを変更する必要があることに注意してください。
C:\Win-builds
_。Process
ボタンを押して、Mingw-w64が含まれるすべてのパッケージをインストールします。MW_MINGW64_LOC
_環境変数を定義する必要があります。コントロールパネル\システム\システムの詳細設定\詳細\環境変数\ $ YOUR_USER_NAMEのユーザー変数\新規
Variable name = MW_MINGW64_LOC
_と_Variable value = C:\Win-builds
_を入れます。 Win-buildはすべての実行可能ファイルを_C:\Win-builds\bin
_に配置し、この変数を定義することにより、Matlabは_gcc.exe
_を探すパスのbin
フォルダーを自動的にスキャンします。MW_MINGW64_LOC
_環境変数を定義したので、 yprime example をビルドしてテストします。そのため、Matlabを起動し、次のコマンドを入力します(それに応じてパスを変更することを忘れないでください)。mex -v 'C:\ Program Files\MATLAB\R2016b\extern\examples\mex\yprime.c'
MEXは正常に完了しました。
yprime(1,1:4)
と入力してインストールをテストできます。答えは次のとおりです。ans = 2.0000 8.9685 4.0000 -1.0947
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
幸運なことに、この時点に至るまでに長い時間がかかりました。
もともとこれは拷問のようなものだと思っていましたが、@ user10171136による上記の回答に基づいて、Fedora LinuxからWindows mex向けにクロスコンパイルするのは非常に簡単であることがわかりました。 Fedoraにはmingwおよびmingw64パッケージがあります。
Sudo yum install mingw64-gcc mingw64-gcc-c++
extern/include
とbin/win64
の両方のディレクトリがインストールされます(実際には、ヘッダーのサブセットとdllの小さなサブセットのみが必要です。libmat.dll libmex.dll libmx.dll
だけで十分です。 。これら2つのディレクトリを既存のLinux MATLABディレクトリの下の新しいR2010a-w64
ディレクトリに配置し、Windowsヘッダーとlibを隠した場所に応じて以下のコマンドを変更します。char16_t
にはmatrix.h
が必要であり、定義されていなかったという問題が1つありました。 matrix.h
はuchar.h
を含めるのを忘れていたと思いますか?私は-include
ディレクティブを回避しました。下記参照。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
これが理にかなっているかどうかを聞いて興味があります。クロスコンパイルの経験はあまりありません。
これは、Windows 8のMatlab 2012bで動作します。
https://github.com/DynareTeam/dynare/blob/master/windows/mexopts-win64.bat
Cgwinディレクトリを変更するか、使用されている場合はmingwディレクトリに置き換えます。 64ビットバージョンに切り替えると、compiler-exeを変更することもできます。