2017年05月 / 04月≪ 12345678910111213141516171819202122232425262728293031≫06月

2010.04.10 (Sat)

TokyoCabinetのRuby用API環境設定

研究室の先輩がRubyを使用しているのだが、TokyoCabinetという、データベースのルーチンライブラリを使用したいとのこと。
そのため、TokyoCabinetのRuby用APIを使用できるように環境設定する必要ができた。
そこで、この記事ではTokyoCabinetの環境設定および詰まった所について記述する。
設定するOSはDebianLINUX,lennyである。

以降は「追記」に記載。



【More・・・】

まず、TokyoCabinetについて。
上記サイトから引用。
  * 空間効率の向上 : データベースファイルがより小さい
  * 時間効率の向上 : 処理がより高速である
  * 並列性の向上 : マルチスレッド環境での同時実行性能の向上
  * 利便性の向上 : APIがより単純である
  * 堅牢性の向上 : 不慮の事態でもデータベースファイルが壊れにくい
  * 64ビット対応 : 巨大なメモリ空間とデータベースファイルを扱える   


Rubyは触ったことがないので、とりあえず先輩からTokyoCabinetを読み込むプログラムを用意してもらった。
このプログラムは非常に簡単なもので、以下のような内容である。


[test.rb]


#!/usr/bin/ruby
require 'tokyocabinet'
include TokyoCabinet
puts "ok"





TokyoCabinetのインストールには次のサイトを参考にした。
  噂のTokyoCabinet/TokyoTyrantを使ってみた

さて、このサイトによると
  ・tokyocabinet-1.4.43.tar.gz
  ・tokyocabinet-ruby-1.30.tar.gz

の2つが必要なようだ。
上のはTokyoCabinetの本体で、下のはRuby用APIのプログラムである。
また、関連ライブラリとして
  ・bzip2-1.0.5.tar.gz
  ・lzmalib-0.0.1.tar.gz
  ・lzo-2.03.tar.gz
  ・zlib-1.2.3.tar.gz
この4つがある。ココからダウンロード。
wgetコマンドで、ダウンロードした。

ダウンロード後は以下の手順でインストール。
なお、関連ライブラリは省く。
基本的に、configureやmakeを利用してインストールできるところは同じである。
また、apt-getなどによるインストールもできる。




# tar zxvf tokyocabinet-1.4.43.tar.gz
# cd tokyocabinet-1.4.43
# ./configure
# make
# make install

# tar zxvf tokyocabinet-ruby-1.30.tar.gz
# cd tokyocabinet-1.4.43
# ./configure
# make
# make install



きちんとライブラリがそろっていれば、エラーは出ないだろう。
エラーの際は、おそらく不足しているライブラリ名が出ると思うのでそれをインストール。
そして以下のようにしてテストプログラムを実行。



$ ruby test.rb
/usr/local/lib/site_ruby/1.8/i486-linux/tokyocabinet.so: /usr/local/lib/site_ruby/1.8/i486-linux/tokyocabinet.so: undefined symbol: tccmpint32 - /usr/local/lib/site_ruby/1.8/i486-linux/tokyocabinet.so (LoadError)
from text.rb:2



ご覧の通り、エラーが出ました。
いろいろ苦戦したが、結局重要だったのが次の部分。

  undefined symbol: tccmpint32

tccmpint32というシンボルが見つからないという。
このtccmpint32というのは、TokyoCabinetで使用されている関数の名前。
ここまではわかったが、この後どうすればよいかわからなかった。
このLoadErrorに半日悩まされたわけだが、インストールは特に問題があったように思えない。

そこで、2chで聞いてみた。
スレチな質問をしてしまったが、親切な方に助言を頂いた。



>> ldconfig -vとすると使えるようになったライブラリ名がずらっと出る。
>> これに tokyocabinetのライブラリが出てないならtokyocabinet自体の
>> インストールの問題、出てくるならruby拡張のほうの問題かなぁ。



助言通り、ldconfig -v を使用する。
すると、TokyoCabinetに関係しそうな部分が2箇所引っ掛かった。



# ldconfig -v
/usr/local/lib:
libtokyocabinet.so.9 -> libtokyocabinet.so.9.6.0
/usr/lib:
libtokyocabinet.so.3 -> libtokyocabinet.so.3.2.0



見る人が見ればわかるのだろうが、私にはこれを見ても原因は予想がつかなかった。
再び親切な方が助言をくれる。



>> tcというプレフィックスのシンボル(関数)が見つからないわけだが、これは名前から分かるようにTokyoCabinetが提供している関数。
>> ということは tokyocabinet-ruby から libtokyocabinet.soが見えていない状態。

>> たぶん、ldd /usr/local/lib/site_ruby/1.8/i486-linux/tokyocabinet.soとすると libtokyocabinet.so とリンクできていないんじゃないかね。

>> ところで、libtokyocabinet.so が /usr/lib と /usr/local の両方にあるってことは、古いほうとリンクしちゃってて、そっちにはtccmpint32がない、とか。



とりあえず、言われるがまま実行してみる。



    #lld /usr/local/lib/site_ruby/1.8/i486-linux/tokyocabinet.so
    linux-gate.so.1 => (0xf7f55000)
    libruby1.8.so.1.8 => /usr/lib/libruby1.8.so.1.8 (0xf7e37000)
    libtokyocabinet.so.3 => /usr/lib/libtokyocabinet.so.3 (0xf7db9000)
    libbz2.so.1.0 => /lib/libbz2.so.1.0 (0xf7da8000)
    libz.so.1 => /usr/local/lib/libz.so.1 (0xf7d92000)
    librt.so.1 => /lib/librt.so.1 (0xf7d89000)
    libpthread.so.0 => /lib/libpthread.so.0 (0xf7d71000)
    libm.so.6 => /lib/libm.so.6 (0xf7d4b000)
    libc.so.6 => /lib/libc.so.6 (0xf7c0d000)
    libdl.so.2 => /lib/libdl.so.2 (0xf7c08000)
    libcrypt.so.1 => /lib/libcrypt.so.1 (0xf7bd6000)
    /lib/ld-linux.so.2 (0xf7f56000)



これをみると、確かにtokyocabinetの部分はバージョン(?)が古い方になっている。
つまり、この動的リンクを直せば、正しく動くのではないか。
まだまだLINUXに詳しくないため、動的リンクについての扱いが良く分からない。
そのため、静的リンクを使うことにした。
下記コマンドを実行し、rubyから呼び出されるtokyocabinetの古いライブラリへの動的リンクを新しいライブラリへの動的リンクに置き換える。

# mv -p /usr/lib/libtokyocabinet.so.3 /usr/lib/libtokyocabinet.so.3.bk
# ln -s /usr/local/lib/libtokyocabinet.so.9 /usr/lib/libtokyocabinet.so.3

こうすることで、とりあえずは Ruby で TokyoCabinet を require することに成功した。
今回、本当に2chの助言に助けられた。
レスを返してくれた人、ありがとう。


テーマ : Linux ジャンル : コンピュータ

00:53  |  LINUX  |  TB(0)  |  CM(0)  |  EDIT  |  Top↑

*Comment

コメントを投稿する

URL
COMMENT
PASS  編集・削除するのに必要
SECRET  管理者だけにコメントを表示  (非公開コメント投稿可能)
 

▲PageTop

*Trackback

この記事のトラックバックURL

→http://gasser.blog114.fc2.com/tb.php/416-d4abecdb

この記事にトラックバックする(FC2ブログユーザー)

この記事へのトラックバック

▲PageTop

 | BLOGTOP |