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 は混合アセンブリです).

C ランタイム ライブラリ


よって,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