ruby-gnome2

WindowsRuby1.9ruby-gnome2が動くかためしてみた。

Rubyhttp://rubyforge.org/frs/download.php/74298/rubyinstaller-1.9.2-p180.exeをインストール。
Rubyコマンドプロンプトから

gem install gtk2

cairoのRDocでエラーが出たけどモジュールは入っているみたいなので気にしないことにした。

irbを起動して、

require 'gtk2'

とするとエラー。

libgdk_pixbuf-2.0-0.dllが見つからないよとダイアログが表示されて、irbにはこんなメッセージがでる。

irb(main):001:0> require 'gtk2'
LoadError: no such file to load -- gtk2.so
        from :29:in `require'
        from :29:in `require'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/gtk2-0.90.7-x86-mingw32/lib/gtk2/base.rb:24:in `rescue in '
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/gtk2-0.90.7-x86-mingw32/lib/gtk2/base.rb:20:in `'
        from :29:in `require'
        from :29:in `require'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/gtk2-0.90.7-x86-mingw32/lib/gtk2.rb:11:in `'
        from :33:in `require'
        from :33:in `rescue in require'
        from :29:in `require'
        from (irb):1
        from C:/Ruby192/bin/irb:12:in `
'

libgdk_pixbuf-2.0-0.dllはC:\Ruby192\lib\ruby\gems\1.9.1\gems\gdk_pixbuf2-0.90.7-x86-mingw32\vendor\local\binにあるんだけど、
gtk2で入ったほかのモジュール(たとえばC:\Ruby192\lib\ruby\gems\1.9.1\gems\gtk2-0.90.7-x86-mingw32\vendor\local\bin)にはパスが通っている。けどpixbufには通っていない。
なのでファイルをパスが通っているところにコピーして、irbを起動しなおしたらrequire 'gtk2'できた。


でも、なんでpixbuf2だけダメなんだろ?
デバッガでちょっとのぞいてみると、irbを起動した時点ではgemで入れたモジュールのパスは何も設定されていない。requireすると、パスに追加された上でモジュールをロードするらしい。

うまくロードできるモジュールはLoadLibraryExWされるまえに環境変数にそのモジュールがあるパスが追加されてからLoadLibraryExWされているようだ。

モジュールはglib2.so→atk.so→cairo.so→pango.so→gtk2.soという順番でロードされくる。gtk2.soがpixbuf2に依存しているけどこの時点でpixbuf2がロードされおらず、モジュールがあるパスも環境変数に加えられていない。だからロードに失敗しているんだな。
これってgtk2のgemパッケージの問題なのだろか?