TAUCSのコンパイル

TAUCSは主に疎行列線形問題を解くためのライブラリです。

他にもUMFPackとかSparseLUとかいろいろなライブラリがありますが、今回はある論文を実装する際、著者がこれを使っているとのことでしたのでTAUCSを使ってみようということになりました。

TAUCSはCG界隈ではまだ結構使われているみたいなのですが、2003年からアップデートされていないので古いのは古いのですがout-of-core実行できるソルバーはあまりないので、まだ使われているみたいです。

割と初回導入が苦労したので備忘録的に残しているもの(VS2010向け)と、新たにVS2012向けのものを加筆しています。

TAUCS, a Library of Sparse Linear Solvers

1. nmakeの環境準備
まず、上のURLにおいてあるZIPファイルに付属しているconfigure.batというファイルを実行します。が、おそらくはうまく実行できないはずです。

TAUCSをWindowsでコンパイルするためにはnmakeと呼ばれるVisual Studio付属のmake環境みたいなものが必要です。

初期設定ではnmakeにはパスが通っていないので、環境変数のパスを通してやります。nmakeは

  • VS2010: C:Program Files(x86)Microsoft Visual Studio 10.0VCbin
  • VS2012: C:Program Files(x86)Microsoft Visual Studio 11.0VCbin

にあると思います。

ここで再度configure.batを実行します。おそらく「〇〇.cに対するビルド方法が指定されていない」などという旨のエラーがでます。
これはmspdb100.dll (VS2012ならmspdb110.dll)というdllがないために起こるエラーですので、TAUCSのディレクトリにこれを移動してあげます。

このDLLは

  • VS2010: C:Program Files(x86)Microsoft Visual Studio 10.0VCbin
  • VS2012: C:Program Files(x86)Microsoft Visual Studio 11.0VCbin

にあるはずです。

ここでもう一度configure.batを実行します。次はヘッダファイルあるいはライブラリが見つからないという旨のエラーが出るかもしれません。
これはnmakeが呼び出しているVisual Studioのコンパイラ「CL」にインクルードのディレクトリが正しく設定されていないために起こるエラーです。

ですので次のように環境変数のPathを編集してあげます。

(VS2010向け)

  • 変数名「CL」: %INCLUDE% %LIBPATH%
  • 変数名「INCLUDE」: /I”C:Program Files(x86)Microsoft Visual Studio 10.0VCinclude” /I”C:Program Files(x86)Microsoft SDKsWindowsv7.0AInclude”
  • 変数名「LIBPATH」: /LIBPATH:”C:Program Files (x86)Microsoft Visual Studio 10.0VClib” /LIBPATH:”C:Program Files (x86)Microsoft SDKsWindowsv7.0ALib”

(VS2012向け)

  • 変数名「CL」: %INCLUDE% /link %LIBPATH%
  • 変数名「INCLUDE」: /I”C:Program Files(x86)Microsoft Visual Studio 11.0VCinclude” /I”C:Program Files(x86)Microsoft Kits8.0Includeum” /I”C:Program Files(x86)Microsoft Kits8.0Includeshared
  • 変数名「LIBPATH」: /LIBPATH:”C:Program Files (x86)Microsoft Visual Studio 11.0VClib” LIBPATH:”C:Program Files (x86)Microsoft Kits8.0Libwin8umx86″

これでconfigure.batは動くはずです。もしかすると「.lastconfがないんだけど」みたいなエラーが出るかもしれませんが、とりあえず出ても大丈夫なので無視します。もしうまくいかない場合は「echo %CL%」などと打ってみてちゃんと環境変数が変更されているかを確認してください。もし期待したものと違うものが出る場合は再起動すると直ると思います。

2. nmakeの実行
さてこれでTAUCSのディレクトリにmakefileができます。あとはコマンドプロンプトで「nmake」とうってEnterを押せばとりあえずコンパイルを開始します。先ほどの環境変数の設定がちゃんとできていれば、おそらく問題なくコンパイルできるはずです。

3. 自分のプログラムに組み込む
コンパイルが完了すると、「(TAUCSのディレクトリ)libwin32」に「libtaucs.lib」というライブラリができているはずです。これで使用準備は完了です。あとはVisual Studio側の設定ですが、僕の環境では、

  1. 追加ライブラリディレクトリに「(TAUCSのディレクトリ)libwin32」と「(TAUCSのディレクトリ)externallibwin32」を追加
  2. libtaucs.lib, liblapack.lib, libatlas.lib, libcblas.lib, libf77.lib, libmetis.lib, vcf2c.libの7つのライブラリをリンカに追加
  3. MSVCRT.libを無視するライブラリに追加

でコンパイルが通るようになりました。ただ、MSVCRT.libを無視しているので「sscanf」などがリンクできずにエラーになると思いますので、それは適当に代替方法で置き換えてください。

ともあれ、これで無事にコンパイルできて何よりでした。

追記
上のように設定してもらえれば基本的には使うことができるのですが、TAUCSを64bitコンパイルすることは今のところできないと思います。

というのもTAUCSにはf77blasなどの昔のライブラリが使われていて、こいつらを64bitコンパイルできなければTAUCSのライブラリ自体を64bit用に作れないためです。

何か良い方法がないかなぁと考えているのですが、この手のライブラリはたいていLinux環境用の依存ファイルを含んでいるので書き直すのは結構骨が折れそうです。

本当だったらもっと新しいソルバーがあればよいのですが…何かご存知の方がいれば教えていただきたいです。