今週は Ruby の拡張ライブラリ作成にハマる

今回も技術ネタ。毎週何かにハマってます。

Debian Lenny に tarball から ruby 1.8.7 をインストールして、zlib の拡張ライブラリを作成しようとするとエラー。

ext/zlib$ sudo ruby extconf.rb
checking for deflateReset() in -lz… yes
checking for zlib.h… yes
checking for kind of operating system… Unix
creating Makefile
ext/zlib$ make
make: ‘all’に対して行うべき事はありません

zlib1g-dev パッケージは入っているのになー、と思いつつググると rails ML で回避策発見。

> zlibでエラーが出てるのでrails zlibでググって見ました。
>
> Vine3.2の例ですがこんなのが引っかかりました。
>
> $ cd ruby-1.8.5/ext/zlib
> $ ruby extconf.rb –with-zlib-include=/usr/include -with-zlib-lib=/usr/lib
> $ make
> $ su
> # make install

このスレ主さんはまだエラー出ているようでしたが私は回避できました。

ext/zlib$ sudo ruby extconf.rb
checking for deflateReset() in -lz… yes
checking for zlib.h… yes
checking for kind of operating system… Unix
creating Makefile
ext/zlib$ sudo ruby extconf.rb –with-zlib-include=/usr/include -with-zlib-lib=/usr/lib
checking for deflateReset() in -lz… yes
checking for zlib.h… yes
checking for kind of operating system… Unix
creating Makefile
ext/zlib$ sudo make
gcc -I. -I. -I/usr/local/lib/ruby/1.8/i686-linux -I. -DHAVE_ZLIB_H -DOS_CODE=OS_UNIX -I/usr/include -D_FILE_OFFSET_BITS=64 -fPIC -g -O2 -c zlib.c
gcc -shared -o zlib.so zlib.o -L. -L/usr/local/lib -Wl,-R/usr/local/lib -L. -rdynamic -Wl,-export-dynamic -lz -ldl -lcrypt -lm -lc
ext/zlib$ sudo make install
/usr/bin/install -c -m 0755 zlib.so /usr/local/lib/ruby/site_ruby/1.8/i686-linux

ライブラリのディレクトリを指定しないで extconf.rb で Makefile 作ると /usr/local/lib や /usr/local/include を見に行くと推測。Debian パッケージでライブラリやヘッダをインストールすると /usr/lib や /usr/include を見に行くので明示的に指定しないといかんかったようです。

そもそも ruby の拡張ライブラリ自体知らなかったので結構時間かかりました。

Comments are closed.