2010年6月25日金曜日

mingw32 と mex のまとめ

Windows 上の Matlab 用の mex ファイルをコンパイルするときのUbuntu 上でのまとめを書いておく。

1. mingw32 をインストールする
$ sudo apt-get install gcc-mingw32 mingw32-binutils mingw32-runtime
2. Windows の Matlab から $MATLABROOT/extern/ をコピーしてくる。これを参照するディレクトリを $MATEXT とでもする。
3. コンパイルするときに、

$ i586-mingw32msvc-g++ -O mexSample.mexw32 -O -shared -I$MAXEXT/include mexSample.cpp $MAXEXT/libmx.lib $MAXEXT/libmex.lib

のようにして、リンクする。
FORTRAN であれば、i586-mingw32msvc-gfortran で対応して、さらに /usr/lib/gcc/i586-mingw32msvc/4.4.2/libgfortran.a をリンクする。
libpthreadGCE2.a をリンクすれば(自分でコンパイルする必要あり)、pthread によるマルチスレッディングも可能のようだが、マルチコアのWindows がないので、まだ未確認である。

なお、MUMPS などは BLAS,LAPACK とリンクするため、libmwlapack.lib, libmwblas.lib も追加する必要がある。
ただし、libmwlapack.lib は関数名の最後にアンダースコアが欠けているので、MUMPS をコンパイルするときに、あらかじめ i586-mingw32msvc-gfortran に -fno-underscoring をつけておく。(普通にコンパイルすると _ddot_ になるが libmwblas.a に入っているのは _ddot のようで、こうするとコンパイルが通る。なお、-fno-underscoring をつけないで回避する方法もあるが、そちらはちょっと面倒)
なお、MUMPS のコンパイル時の ar,ranlib は /usr/i586-mingw32msvc/bin/ar,/usr/i586-mingw32msvc/bin/ranlib にしておくこと。
ただし、Matlab は R2009a から libmwlapack.lib, libmwblas.a のインターフェースを変更しているので、MUMPS を R2009a 以降で使うのは難しそうである。

あと、mingw でコンパイルしたファイルは、Visual C++ でコンパイルしたときに比べて、ファイルサイズが大きくなるようである。
どうも昨日心配していた Matlab 由来のコードが追加されるのではなく、 gcc と Windows をつなぐものがいろいろと追加されているためだと思われる。たしかに
$i586-mingw32msvc-objdump -p mexSample.cpp | grep DLL
とすると、libmx.dll, libmex.dll を必要としていることが分かる。
dll のコードを直接取り込むのであれば、 dll にリンクする情報は入れる必要がない。


これらを行うと、Windows XP 上で利用可能な mex ファイルを作成できる。
SDPA-M の場合、以下のDLL とリンクする。
$ i586-mingw32msvc-objdump -p mexsdpa.mexw32 | grep DLL
DLL
vma: Hint Time Forward DLL First
DLL Name: libmex.dll
DLL Name: libmwblas.dll
DLL Name: libmwlapack.dll
DLL Name: libmx.dll
DLL Name: pthreadGCE2.dll
DLL Name: KERNEL32.dll
DLL Name: msvcrt.dll
DLL Name: msvcrt.dll


今日の作業内容:mex 4h
今日のBGM:聖剣伝説 OST
今日のランチ: 東急ストア ブルーベリーヨーグルト、11品目ひじき、マルちゃん焼きそば弁当
明日の予測作業時間:3h



0 件のコメント:

コメントを投稿