Boost と Boost.Bindings と clapack のインストール

今回は lapack の機能を使えるようにするための準備(インストール)を行います.
そのためには以下の三つのコンポーネントをインストールする必要があります.

  • boost
  • boost-sandbox
  • clapack

一つずつ説明していきます.

boost のインストール

uBLAS はこの boost のコンポーネントの一つです.boost のインストールにはヘッダファイルを
ダウンロードするだけでいいのですが,それには次の二つの方法があります.

  1. Boost Downloads の Download リンクからダウンロード
  2. Subversion によりダウンロード

後者の場合,boost の最新開発版をダウンロードすることになります.
Subversion を用いる場合,以下のコマンドでダウンロードできます.

svn co http://svn.boost.org/svn/boost/trunk boost

ここでは,Subversion のインストールはすでに終わっているものとします.
前者の場合は解凍したフォルダを,後者の場合はダウンロードしたフォルダを適当な場所
(ここでは C:\Program Files とします)に保存し,コンパイラがヘッダファイルを読み込めるようにパスを設定します.
(前者の場合,C:\Program Files\boost_1_XX_X,後者の場合 C:\Program Files\boost)にパスを通すことになります.
C:\Program Files\boost_1_XX_X\boost あるいは C:\Program Files\boost\boost フォルダに

  • accumulators
  • algorithm
  • archive
  • asio
  • assign

などのフォルダがあることを必ず確認してください.
以上で boost のインストールは終了です.より詳しく知りたい方は

をご覧ください.

boost-sandbox のインストール

Boost.Bindings はこの boost-sandbox のコンポーネントの一つです.
boost のときと同じく,Subversion によりヘッダファイルをダウンロードし,コンパイラのパスを通すだけでインストールは完了です.
boost-sandbox は以下のコマンドによりダウンロードできます.

svn co http://svn.boost.org/svn/boost/sandbox boost-sandbox

sandbox や レポジトリの構成については

をご覧ください.また,最新の Boost.Bindings は

で手に入ります.

clapack のインストール

Windows で開発を行っている場合,clapack のインストールは信じられないくらい簡単です.
というのも,clapack を公開している

がすでにビルド済みのバイナリを公開してくれているからです.遠慮せず全部ダウンロードしてコンパイラのパスを通しておきましょう.
Linux で開発を行っている場合……そういう人はすでに予期していることと思いますが……clapack のコンパイルが必要です…….
今回の説明では,現時点での最新版である clapack 3.1.1 のコンパイルとインストールの説明を行いたいと思います.

まず clapack.tgz をダウンロードし,適当な場所に解凍します.
解凍したフォルダにある README.install というファイルをざっと眺めてみます.
そこには,
"各プラットフォーム向けの make.inc が CLAPACK/INSTALL ディレクトリにあるから,それを CLAPACK にコピーして持ってきて,必要があれば適当に修正してね."
と書かれています.しかし,CLAPACK/INSTALL のどこにもそのようなファイルはありません.
私は初めて clapack 3.1.1 を(このときは cygwin に)インストールしようとしていたとき,この問題につまづきました.
解決したときにこの過疎スレに書き込んだのですが,あまりに過疎過ぎて心配なため,念のためここにもその方法を記しておこうと思います.
具体的には,次のようにします.

  1. このサイトに前のバージョン(3.0)の clapack があるため,ダウンロードして解凍します.
  2. このバージョン 3.0 には CLAPACK/INSTALL にちゃんと make.inc.LINUX があることを確認します.
  3. このバージョン 3.0 の make.inc.LINUX を参考にしながら,バージョン 3.1.1 の CLAPACK フォルダにある make.inc.sample を次のように書き換え,それを make.inc とします.
    1. 「SHELL = /bin/sh」を追加.
    2. 「CC = gcc -ffloat-store」に変更.-ffloat-storeオプションをつけないと clapack のテストに通りません(詳細 http://icl.cs.utk.edu/lapack-forum/archives/lapack/msg00429.html).
    3. 「CFLAGS = -funroll-all-loops -O3」に変更.
    4. 「LOADOPTS = $(CFLAGS)」に変更.
    5. 「NOOPT = 」に変更(NOOPTは空にする).
  4. cygwinコンパイルする場合,cygwingcc のデフォルトの出力ファイル名は a.exe になっているため,F2CLIBS\libf2c\Makefile の186行目と187行目の a.out を a.exe に変更します.

あとはひたすら make します.具体的には,次のようにします(README.install に書かれていることと同じです).

make f2clib
make blaslib
cd BLAS/TESTING
make -f Makeblat2
cd ..
./xblat2s < sblat2.in
./xblat2d < dblat2.in
./xblat2c < cblat2.in
./xblat2z < zblat2.in
cd TESTING
make -f Makeblat3
cd ..
./xblat3s < sblat3.in
./xblat3d < dblat3.in
./xblat3c < cblat3.in
./xblat3z < zblat3.in
cd ../SRC
make
cd ../TESTING/MATGEN
make
cd ..
make

CLAPACK/INCLUDE フォルダを好きな場所にコピーし,コンパイラのパスを通します.
また,

を好きな場所にコピーし,コンパイラのパスを通します.
さらに,

のシンボリック リンクを作成します.

clapack を使ったソースコードコンパイルするときは?

次のようにします.

  • Visual C++
    • プロジェクト→プロパティ→構成プロパティ→リンカ→入力→追加の依存ファイルに以下を加える.
      • BLAS.lib libf2c.lib clapack.lib

あるいは,

    • 次のコードをソースに加える.
#pragma comment(lib, "BLAS.lib")
#pragma comment(lib, "libf2c.lib")
#pragma comment(lib, "clapack.lib")

VC でリンク時にエラーがでる・・・

  • xxx は既に MSVCRT.lib(MSVCRXX.dll) で定義されています。
  • defaultlib 'MSVCRT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
  • defaultlib 'libcmt.lib' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。

プロジェクト→プロパティ→構成プロパティ→リンカ→コマンド ラインに /NODEFAULTLIB:libcmt を加えます.

ところで,コンパイラのパスを通すって?

それぞれの開発環境ごとにパスの通し方は違ってくるため,ここでは詳細に説明できませんが,次の2つの有名な開発環境では大体以下のようにします.

  • Visual C++
    • ツール→オプション→プロジェクトおよびソルーション→VC++ ディレクトリより,「ディレクトリを表示するプロジェクト」で「インクルード ファイル」あるいは「ライブラリ ファイル」を選択し,パスを追加.
  • gcc
    • コンパイル時に -I や -L オプションにより追加したいパスを指定.

Linux で開発を行っている方で,毎回 -I や -L を指定するのが面倒だという人は,環境変数

  • C_INCLUDE_PATH
  • CPLUS_INCLUDE_PATH
  • LIBRARY_PATH
  • LD_LIBRARY_PATH

について調べてみるとよいかもしれません.


次回は早速 clapack を用いて特異値分解(SVD, Singular value decomposition)を計算してみます.