2010-02-22

Protocol Buffersをビルド~リンクするメモ

Cの構造体のようなものをそのままシリアライズしたくなったのでProtocol Buffersを試してみようと思います。
http://code.google.com/intl/ja/apis/protocolbuffers/docs/overview.html

Protocol BuffersはまだDebianパッケージにはなってないようなのでソースからビルドします。
ソースは以下から
http://code.google.com/p/protobuf/downloads/list

とりあえず現在最新バージョンの2.3.0を落として普通にビルドしてみます。
wget http://protobuf.googlecode.com/files/protobuf-2.3.0.tar.gz
tar xzf protobuf-2.3.0.tar.gz
cd protobuf-2.3.0
./configure
make
make check
sudo make install

以上がうまくいっていれば、
protoc --version
でバージョンが表示されるはずですが、どうやらライブラリのリンクがうまくいかないようです。
% protoc --version
protoc: error while loading shared libraries: libprotobuf.so.6: cannot open shared object file: No such file or directory

ちなみに使用環境は、
% uname -a
Linux chameleon 2.6.26-2-amd64 #1 SMP Thu Feb 11 00:59:32 UTC 2010 x86_64 GNU/Linux

こんな時は、make install した時に表示される以下のようなメッセージ従ってリンク先のパスを設定します。
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,-rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

上の方法の他に/libにシンボリックリンクを張ったりでもたぶん大丈夫ですが、バイナリファイルにリンク情報を埋め込んでやる方が安全です。
(本来は/etc/ld.so.conf で設定されているはず。当環境では/usr/local/lib をみるようにすで設定されてたけど、なぜかリンクエラーになる。原因不明。)

リンク情報を埋め込むには、MakefileのLDFLAGSの行に以下のようにしてリンカオプションを渡してやります。
LDFLAGS = -Wl,-rpath,/usr/local/lib

ちなみに、Makefileは複数ありますが、編集するのは protobuf-2.3.0/src/Makefile だけでOKです。

LDFLAGSを設定したらsrc以下だけ再度ビルド、protobuf-2.3.0/src/.libs/ 以下に生成されているバイナリをobjdumpして正しいRPATHが入っていればOKです。
$ objdump -p .libs/protoc | grep RPATH
  RPATH       /usr/local/lib

再度インストールして、きちんとバージョンがでればOKです。
$ protoc --version
libprotoc 2.3.0

0 件のコメント:

コメントを投稿

ZenBackWidget