「RからBLAS/LAPACKを使う」ときのトラブル
C言語でBLAS(Basic Linear Algebra Subprograms)の関数を使ったR用dllを作っているときにちょっとしたトラブルに見舞われた。対処法を見つけたので忘れないうちに書いておく。
上のページでとても親切に解説してあるので、BLASの関数を使ったR用のdll作成時には大変参考になった。しかし、BLASをGotoBLASに入れ替えている(自前でコンパイルしたGotoBLASのdllをRblas.dllにリネームして使っている)場合に起きる問題がある*1。
R CMD SHLIBでコンパイルしてdllを作成しても、プログラム実行時に「libgoto_*****.dllが見つかりません」といったエラーが出てしまうのだ。そんな名前のdllを使えとは言っていないはずなのに。変なエラーである。困った。
どうやらこの原因は、R CMD SHLIBでdllを作成する際に、リネーム済みのファイル名(Rblas.dll)でなく、ファイル内部に記録された元のファイル名(libgoto_*****.dll)を参照しているせいだと分かった。
なので、GotoBLASをコンパイルして最後にWindows用のdllを作成するコマンドを通常の"make dll"ではなく、
make dll -e LIBDLLNAME="Rblas.dll"
のようにして正真正銘のRblas.dllを作ってやればよい。できたRblas.dllをRのbinディレクトリに入れれば先の問題は解決する。
再度コンパイルするのが面倒だという人は、多少強引なやり方だが、リネームしただけのRblas.dllをバイナリエディタで開いて、"libgoto_*****.dll"という名前を検索し、それを"Rblas.dll"に書き換えてやってもいい。(もちろん余った部分はすべて0で置き換える)
これで、BLASの関数を使うdllをR CMD SHLIBで作成しても、これからはきちんとRblas.dllという名前を参照してくれるようになる。はず。
*1:GotoBLAS限定の問題というより、(私のように)半端な知識で純正でないRblas.dllをただリネームしてRで使っている人は皆突き当たるであろう問題