2010年10月25日月曜日

DLL なしのSDPA の Windows バイナリのコンパイル方法

昨日のコンパイル方法では、pthread が dll となってしまうため、これを static でリンクすることにした。
これによって pthreadGC2.dll を別途コピーする必要なく Windows 上で実行できるようになる。

static にするのは、pthread-win32 のページで配布されている tar.gz ではうまく行かなかったため、cvs でソースを持ってくる。参考にしたのは、
http://blog.k-tai-douga.com/article/39079027.html
であるが、つまり
$ cvs -d :pserver:anoncvs@sourceware.org:/cvs/pthreads-win32 login
で cvs のログイン情報を乗せる(パスワードは、anoncvs である。)
このあと、
$ cvs -d :pserver:anoncvs@sourceware.org:/cvs/pthreads-win32 checkout pthreads
とすると、pthread-win32 が取り出せる。
コンパイルは、
$ make -f GNUmakefile CROSS=i586-mingw32msvc- clean GC-static
である。
これにより、libpthreadGC2.a が作られる。pthreadGC2.dll があると dll が必要となるので、これが生成されていないことを確認しておきたい。

次に、SDPA 7.3.2 の configure としては、

export CFLAGS="-D__CLEANUP_C -O3 -finline-functions -DPTW32_BUILD_INLINED -DPTW32_STATIC_LIB -I(どこか)/pthreads -I. -DHAVE_CONFIG_H -Wall"
export FCFLAGS="${CFLAGS}"
export CXXFLAGS="${CFLAGS}"
./configure --prefix=(どこか)/sdpa-install --build=x86_64-unknown-linux-gnu --host=i586-mingw32msvc --target=i586-mingw32msvc --with-blas="(どこか)/lapack-3.2.2/blas_LINUX.a (どこか)/pthreads/libpthreadGC2.a /usr/i586-mingw32msvc/lib/libwsock32.a" --with-lapack=(どこか)/lapack-3.2.2/lapack_LINUX.a

ポイントは、
[1] PTW32_STATIC_LIB を define した上で pthread.h を include すること。(これをしないと __imp__pthread_??? という関数ができてしまい、リンクできなくなってしまう。)
[2] libpthreadGC2.a と一緒に libwsock32.a もリンクすること。
である。
SDPA の場合、--with-blas のところに来ているライブラリが最後の方にリンクされるので、ここに無理に追加している。

これで
$ make
とするが、もちろん、MUMPS で失敗する。
$ cd mumps/build
として、
Makefile.inc の最後に以下の2行を追加する。
AR = i586-mingw32msvc-ar vr
RANLIB = i586-mingw32msvc-ranlib
このあとで mumps/build で
$ make clean d
で mumps のライブラリはコンパイルできる。
(このとき、PTW32_STATIC_LIBが define されていることも分かる)

そのあと、sdpa-7.3.2 のディレクトリに戻って
sdpa_tool.cpp, sdpa_newton.h
に昨日と同じ修正を施して、
$ make
とすると、sdpa.exe ができる。
$ wine ./sdpa.exe example1.dat-s example1.result
で実行できるのを確認してから Windows 上にコピーする。
(もちろん、dat-s ファイルは nkf で改行コードを変更しておく。)

なお、ros_500.dat-s を解いたところ、native の SDPA と wine 上の SDPA だと 10 倍程度の計算速度の違いが出る。

最終的には出来上がったが、PTW32_STATIC_LIB に気づくまでに1時間間30分以上をロスしてしまった。

今日の作業内容:
6:30-7:30 [ok] Embedded in the shadow 読み p1-p10
7:45-8:30 [ok] 会議用投稿の査読
10:00-10:30 [ng] pthread-win32 static compile
10:30-11:00 [ng] pthread-win32 static compile
11:00-11:30 [ng] pthread-win32 static compile
13:00-14:00 [ok] SDPARA 原稿校正
13:30-14:30 [ng] pthread-win32 static compile
14:30-15:30 [ok] pthread-win32 static compile
15:30-16:00 [ok] Embedded in the shadow 読み
今日のランチ:しなの カツオのタタキ丼とうどんのセット
明日の予測作業時間:5h

0 件のコメント:

コメントを投稿