2014/05/30(金) [n年前の日記]
#2 [ruby] cairo + Ruby Windows版が使えない
Windows7 x64 + Ruby 1.9.3 p545 (i386-mingw32) + cairo 1.12.9 x86-mingw32 で cairo を試してみようとしたら、cairo.so がロードできないとエラーが。
ややこしいことに、Ruby 2.0.0 p451 (i386-mingw32) + cairo 1.12.9 x86-mingw32 なら使えるようで。
_[ruby-list:49399] Re: cairo 1.12.5 x86-mingw32 で cairo.so が見つからない が関係ありそうな気がする。
Rubyインストールフォルダ\lib\ruby\gems\2.0.0\gems\cairo-1.12.9-x86-mingw32\lib\ のファイル構成は以下のようになっていて。
cairo.rb の中で以下の処理を通るのだけど。 Ruby 2.0.0 の場合は、2.0/cairo.so が require されるのでエラーが出ない。
しかし Ruby 1.9.3 の場合は、1.9/cairo.so なんて存在しないので、require 'cairo.so' を通ってしまって、「そんなもんねえよ!」と言われるらしい。
1.9/cairo.so が入ってるバージョンが、かつては存在していたはず…と予想して、試しに古いバージョンを入れていったら、昔はたしかに 1.9/cairo.so が存在していたらしい。
過去バージョンの一覧は、 _all versions of cairo | RubyGems.org | your community gem host で見れる。色々インストールして確認してみたけど、lib/以下のフォルダの有無は以下の通り。
つまり、Ruby 1.9.x で cairo を使いたかったら、1.12.4 より前のバージョンを指定してインストールしないといかんらしいです。
_Comparing v1.12.5...master - rcairo/rcairo - GitHub を眺めていたら、Drop Ruby 1.8 support なるテキストがあった。Dec 17, 2013 の時点で Ruby 1.8非対応になった、ということだろうか…。それ以前から Ruby 1.8 用の cairo.so は同梱されてないみたいではあるけど。
> ruby --version ruby 1.9.3p545 (2014-02-24) [i386-mingw32] > gem install cairo --platform x86-mingw32 > gem list | grep cairo cairo (1.12.9 x86-mingw32) > ruby -r cairo -e "p Cairo::VERSION" C:/Ruby/Ruby193mingw/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- cairo.so (LoadError) from C:/Ruby/Ruby193mingw/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require' from C:/Ruby/Ruby193mingw/lib/ruby/gems/1.9.1/gems/cairo-1.12.9-x86-mingw32/lib/cairo.rb:46:in `rescue in <top (required)>' from C:/Ruby/Ruby193mingw/lib/ruby/gems/1.9.1/gems/cairo-1.12.9-x86-mingw32/lib/cairo.rb:42:in `<top (required)>' from C:/Ruby/Ruby193mingw/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:60:in `require' from C:/Ruby/Ruby193mingw/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:60:in `rescue in require' from C:/Ruby/Ruby193mingw/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:35:in `require'
ややこしいことに、Ruby 2.0.0 p451 (i386-mingw32) + cairo 1.12.9 x86-mingw32 なら使えるようで。
> pik 200 Select which Ruby you want: 1. 200: ruby 2.0.0p451 (2014-02-24) [i386-mingw32] 2. 200: ruby 2.0.0p353 (2013-11-22) [i386-mswin32_100] ? 1 > ruby --version ruby 2.0.0p451 (2014-02-24) [i386-mingw32] > ruby -r cairo -e "p Cairo::VERSION" [1, 12, 16]
_[ruby-list:49399] Re: cairo 1.12.5 x86-mingw32 で cairo.so が見つからない が関係ありそうな気がする。
Rubyインストールフォルダ\lib\ruby\gems\2.0.0\gems\cairo-1.12.9-x86-mingw32\lib\ のファイル構成は以下のようになっていて。
C:\RUBY\RUBY200MINGW\LIB\RUBY\GEMS\2.0.0\GEMS\CAIRO-1.12.9-X86-MINGW32\LIB │ cairo.rb │ ├─2.0 │ cairo.so │ ├─2.1 │ cairo.so │ └─cairo │ color.rb │ colors.rb │ constants.rb │ context.rb │ device.rb │ paper.rb │ papers.rb │ path.rb │ pattern.rb │ point.rb │ surface.rb │ └─context blur.rb circle.rb color.rb path.rb rectangle.rb triangle.rb
cairo.rb の中で以下の処理を通るのだけど。 Ruby 2.0.0 の場合は、2.0/cairo.so が require されるのでエラーが出ない。
begin major, minor, _ = RUBY_VERSION.split(/\./) require "#{major}.#{minor}/cairo.so" rescue LoadError require 'cairo.so' end
しかし Ruby 1.9.3 の場合は、1.9/cairo.so なんて存在しないので、require 'cairo.so' を通ってしまって、「そんなもんねえよ!」と言われるらしい。
1.9/cairo.so が入ってるバージョンが、かつては存在していたはず…と予想して、試しに古いバージョンを入れていったら、昔はたしかに 1.9/cairo.so が存在していたらしい。
過去バージョンの一覧は、 _all versions of cairo | RubyGems.org | your community gem host で見れる。色々インストールして確認してみたけど、lib/以下のフォルダの有無は以下の通り。
cairo 1.10.2 : 1.8 / 1.9 cairo 1.12.3 : 1.8 / 1.9 cairo 1.12.4 : 1.9 / 2.0 cairo 1.12.5 : 1.9 / 2.0 ※ Ruby 1.9 で動かない。 cairo 1.12.6 : 1.9 / 2.0 ※ Ruby 1.9 で動かない。 cairo 1.12.7 : 1.9 / 2.0 / 2.1 ※ Ruby 1.9 で動かない。 cairo 1.12.8 : 1.9 / 2.0 / 2.1 ※ Ruby 1.9 で動かない。 cairo 1.12.9 : / 2.0 / 2.1 ※ Ruby 1.9 で動かない。
つまり、Ruby 1.9.x で cairo を使いたかったら、1.12.4 より前のバージョンを指定してインストールしないといかんらしいです。
gem uninstall cairo gem install cairo --platform x86-mingw32 -v=1.12.4
_Comparing v1.12.5...master - rcairo/rcairo - GitHub を眺めていたら、Drop Ruby 1.8 support なるテキストがあった。Dec 17, 2013 の時点で Ruby 1.8非対応になった、ということだろうか…。それ以前から Ruby 1.8 用の cairo.so は同梱されてないみたいではあるけど。
[ ツッコむ ]
以上です。