CLAPACK-3.1.1-VisualStudio を利用する
長らく Lisys は CLAPACK3-Windows を利用していたのですが,開発環境を Visual Studio 2008 へ移行するのに伴い,CLAPACK-3.1.1-VisualStudio に変更しました.
CLAPACK
問題
しかしまぁ,すんなりといくはずもなく...
CLAPACK-3.1.1-VisualStudio は /MT でビルドされているらしく,/clr でビルドしている Lisys ではリンカエラーが発生します.
// ↓例えばこんな感じのエラー
エラー 8 error LNK2005: _exit は既に MSVCRT.lib(MSVCR90.dll) で定義されています。 libcmt.lib CLW
Lisys を /MT にできればよいのですが,/clr では /MT を指定できません (Lisys は混合アセンブリです).
よって,CLAPACK-3.1.1-VisualStudio を /MD でリビルドする必要があります.
ビルド環境
Windows XP SP3
Visual Studio 2008 SP1
オプション変更
blas,clapack,libf2c プロジェクトのプロパティを開き,以下の値に変更します.
- [構成プロパティ]-[C/C++]-[コード生成] の [ランタイム ライブラリ]
- Release: /MD
- Debug : /MDd
コード修正
// at F2CLIBS\libf2c\fio.h ... extern int isatty(int); ...
が,
// Visual Studio 9.0\vc\include\io.h ... _Check_return_ _CRT_NONSTDC_DEPRECATE(_isatty) _CRTIMP int __cdecl isatty(_In_ int _FileHandle); ...
のリンケージと異なるため,リンク時にエラーが発生します (libf2c プロジェクトの open.c にて発生).
今回は,fio.h の "extern int isatty(int);" をコメントアウトすることで対処します.
ビルド
Debug without wrap Win32/Release without wrap Win32 でビルドします.
大量のエラー&警告が発生します (主にテストプロジェクトで発生) が,blas/clapack/libf2c プロジェクトのビルドが正しくできていれば問題ないと思います.
利用方法
Lisys-0.6.4 の readme.ja にある「■ ライブラリのビルド方法」をご覧ください.
基本的には,clapack_nowrap.lib,BLAS_nowrap.lib,libf2c.lib をリンク対象に追加すれば OK です.
追記 2010/06/29
以下のサイトによると,6 ファイルほどプロジェクトから漏れているようです.
念のため確認してみると,実際には 8 ファイル漏れています (blas.vcproj と BLAS/SRC/*.c を突き合わせて確認).
- csrot.c
- drotm.c
- drotmg.c
- dsdot.c
- sdsdot.c
- srotm.c
- srotmg.c
- zdrot.c
上記を blas プロジェクトの Srouce Files に追加すれば OK.上記のやつらは LAPACK-revisions3.1.1.info によると,3.1.1 で加えられた新しい関数っぽい.何で抜けてたんだろう...
lib のシンボル確認は以下の通り.
dumpbin /linkermember hoge.lib /out:hoge.symbol.txt