gem ffi を使って Ruby から Go の関数を実行
下記を参考にしたが、いろいろエラーが出て実行できなかった。
そもそも環境情報がかなり不足している。
筆者の環境
macOS High Sierra
Version 10.13.3
code:bash
$ ruby -v
code:bash
$ go version
go version go1.10.3 darwin/amd64
code:bash
$ gem list | grep ffi
ffi (1.9.25)
最初に遭遇したエラー
Mac で実行。
code:bash
Could not open library './sum.so': dlopen(./sum.so, 5): no suitable image found. Did find: (LoadError)
./sum.so: unknown file type, first eight bytes: 0x7F 0x45 0x4C 0x46 0x02 0x01 0x01 0x00
上記によると、mixed architectures ( 32bit、64bit)が原因らしい。
Go のビルドは コンテナじゃなくて Mac ですることにした。
brew で Go をインストール。
次に遭遇したエラー
code:bash
`attach_function': Function 'sum' not found in ./sum.so (FFI::NotFoundError) 何回やっても出る。
いろいろサンプルをあたっているうちに以下の記事に出会った。
code:bash
$ go build -o my_lib.so -buildmode=c-shared my_file.go
なんと、微妙に build コマンドが違うじゃないか!
❌
code:bash
$ go build -buildmode=c-shared -o sum.so sum.go
Go のバージョンによるものらしい。
やっぱり環境情報大事。
成果物
参考