「RからBLAS/LAPACKを使う」ときのトラブル

C言語BLAS(Basic Linear Algebra Subprograms)の関数を使ったR用dllを作っているときにちょっとしたトラブルに見舞われた。対処法を見つけたので忘れないうちに書いておく。

RからBLAS/LAPACKを使う

上のページでとても親切に解説してあるので、BLASの関数を使ったR用のdll作成時には大変参考になった。しかし、BLASGotoBLASに入れ替えている(自前でコンパイルした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で使っている人は皆突き当たるであろう問題