「cblas_sscalがない」と言われたとき

先日Nimでneoというパッケージを使ったプログラムを動かそうとしたとき、コンパイルまでは通ったのだが、実際に実行しようとしたら以下のエラーが出てハマった。

$ cat src/ai2
import neo

let m = randomMatrix(3, 7)
echo m
$ nimble build
$ ./ai2
could not import: cblass_sscal  # ←エラー
$ 

調べてみると、cblas_sscalとは線形代数演算ライブラリBLASの一部らしい。さらに調べてみるとBLASにはいろんな種類があり、どの種類をインストールしたらよいか迷ったが今回はatlasというライブラリをyumでインストールした。実は他の種類blaslapackもインストールしてみたのだが、これらにはcblas_sscalが入っていなかった。

解決策

atlasとlapackyumでインストール
$ sudo yum install atlas atlas-devel
$ sudo yum install lapack
defineオプションを追加して再ビルド
$ nimble build --define:blas=tatlas

この--define:blas=tatlasミソ。このオプションはnimblasというパッケージで使用されている。cblass_sscalは私のCentos7.5には/usr/lib/atlas/libtatlas.so.3.10の中に入っていることが分かったため、このような形になった。

結果

今度はうまく動作した。

$ ./ai2
[ [ 0.2326961497609559  0.9894961846897405      0.5936563635008223      0.8244128746481869      0.04526972974926768     0.2417286976201536      0.2114615988047588 ]
  [ 0.8228467011541094  0.4437264946689483      0.195534693152861       0.6844019291752474      0.9574039031918617      0.4352774127669565      0.438158530187601 ]
  [ 0.3333379470197706  0.07581602342631522     0.5258890850057507      0.4899364645980169      0.1510872370471941      0.6537294148212911      0.8833919949505109 ] ]
$ 

参考

追記(2018-06-18)

別のLinuxで今回のブログを検証した結果、lapackというライブラリも必要なことがわかったので、lapackyumでインストールする部分を追加した。