2011-11-28

LevelDBの共有ライブラリを作る

2011年11月28日現在、LevelDBのMakefileはまだ共有ライブラリの生成に対応してないので、それについてのworkaround。何度も同じことを考えるのを防ぐための備忘用。

まず、元になるオブジェクトコードを作る。

CFLAGS="-I$HOME/opt/snappy-1.0.4/include" \
gmake CC="g++ -m64" OPT="-O2 -DNDEBUG -fPIC" \
SNAPPY_CFLAGS="-I$HOME/opt/snappy-1.0.4/include -DSNAPPY"          

各指定の簡単な解説。

最初のCFLAGSはSnappyのヘッダの位置をプリプロセッサに伝える。標準の位置にあるならこの指定は不要。build_detect_platformでのみ有効で、MakefileでCFLAGSは上書きされる。SNAPPY_CFLAGSでも同じ指定をしているのはそのため。

今回は64ビットのライブラリを作りたい(Clozure CLの64ビットバイナリからFFI経由で使いたくなった)ので、CCはg++ -m64で。GCC 4.7より前のバージョンでは、GCCをビルドするときに設定しない限り、Solaris/x86-64でもデフォルトで64ビットコードを作らない。Solaris 11の標準のGCC 4は4.5.2。

効率的に動作して欲しいので、-fPICを付ける。適当な場所が見当たらなかったので、OPTに追加。

SNAPPY_CFLAGSは上に書いているように、ヘッダの位置の指定を追加。

次に、共有ライブラリを作る。

g++ -m64 -shared -Wl,-h,libleveldb.so.0 \
db/*.o port/*.o table/*.o util/*.o \
-Wl,-R,$HOME/opt/lib -L$HOME/opt/snappy-1.0.4/lib \
-lsnappy -lpthread -lrt -o libleveldb.so.0.0

64ビットのライブラリを作るため、-m64を指定するのは同じ。

-sharedで共有ライブラリを作ると指定し、-Wl,-hでsonameを指定するためのオプションをリンカに渡す。Solarisのldでは-sonameではなく-h。あるいは--soname。

材料のオブジェクトファイルは上の例のように指定すればすべて揃う。不安ならmakeしたときにarに渡されているファイルと照らし合わせれば確認できる。

リンクするライブラリは、Snappyと、環境に依存するライブラリ。これは、makeするときにできるbuild_config.mkを見れば分かる。PLATFORM_LDFLAGSに指定されているもの。Snappyも64ビットとしてビルドされていないと、当然リンクできないので注意。Snappyが標準の場所にないので、-Wl,-RでRUNPATHも指定する。

以上。あとは適当にサーチパスに放り込んで、libleveldb.so.0とlibleveldb.soという名前のシンボリックリンクをlibleveldb.so.0.0に張れば終わり。