いつもsqliteを使っていたので、たまには違うものを使っておこうと思い、leveldbを使ってみることにした。
configureなどがないので、makeして、includeディレクトリと、out-staticに入っていたlibleveldb.aを別の場所にコピーして、emnl/leveldb-c-exampleからleveldb_example.cを持ってきた。
$ gcc -I./include -o tst leveldb_example.c -L. -lleveldb -pthread
・・・大量にリンクエラーが出てきた。
deleteがどうのこうのと出ているので、C++のライブラリがいるようだ。
まあ、もとがC++だから、仕方ないか。。。
しかし、snappyとかいうエラーも出ている。
データを圧縮するライブラリらしいが、必須なのか?
Makefileを見ていくと、どうやらbuild_detect_platformというスクリプトで環境をチェックして、設定をbuild_config.mkに作り、それをMakefileが読込んでいるようだ。
どうやら、私が使っている環境ではsnappyをapt-getか何かでインストール済みのようだ(実を言えば、leveldbもインストール済みだった)。
今回は最小構成にしたいので、スクリプトでsnappy検出のところをコメントアウトさせた。
これでもlibstdc++.aみたいなものはいるので、あきらめよう。
$ gcc -I./include -c leveldb_example.c
$ gcc -o tst leveldb_example.o -L. -lleveldb -pthread -lstdc++
動くようだ。
サンプルが、leveldb_put()するときに"value"という文字を書き込んでいるのだが、きっちり5byte分しか書込んでいないので、その後でleveldb_get()したあとにprintf()したときの文字が化けて出力されることがあるようなので、気になる人は\0まで書込むなり、get後に\0を足すなりするとよかろう。
Cだけで書かれたNoSQLというかKVSのライブラリがあると、小さそうでよいのだけどね。
今日試したら、何もしなくてもsnappyうんぬんは出てこなかった(-lstdc++はいる)。
返信削除