ruby-postgresとssleay32.dll

rubyPostgreSQL を使うには ruby-postgres か postgres-pr (pure ruby版)があって、私の Windows 環境だとこれまで前者がなぜか動かなかった。gem で公開されているわけだから、私の環境の問題なんだろうと postgres-pr を使っていたんだけど、なんとなく悔しいのでちょっと調べてみることに。

まず発生するエラーはこれ。

$ ruby -rubygems -e 'require "postgres"'
c:/ruby-1.8.6/lib/ruby/gems/1.8/gems/ruby-postgres-0.7.1.2006.04.06-mswin32/
./postgres.so: 182: このオペレーティング システムでは %1 は実行されません。   

なんのことだかさっぱり。

DependencyWalker で postgres.so を開いてみると、"Error: At least one module has an unresolved import due to a missing export function in an implicitly dependent module."とでる。エラーマークがついてるのは、shlwapi.dllmpr.dllssleay32.dll の3つ。このうち shlwapi.dllmpr.dll は他の(問題が起こらない) DLL でもエラーマークがでるのでたぶん関係ないんだろう。

ssleay32.dll は、ruby の bin ディレクトリにある DLL で、libpq.dll が必要としている Ordinal 284 の関数がないと表示されている。libpq.dllPostgreSQL のライブラリだから、ssleay32.dll が問題っぽい。探してみると、PostgreSQL の bin ディレクトリにも ssleay32.dll が見つかった。こっちは、ちゃんと 284番の関数が入ってる。

ようするに、Onclick Installer 版の ruby についてきた ssleay32.dll のバージョンと PostgreSQL が必要としているバージョン(かビルド時の設定かなにか)が違うせいみたいだ。DLL を探す順番を変更できないかと、環境変数の PATH の ruby の bin のパスを Postgres の後ろに移動させてみたけどだめだった。しょうがないので、PostgreSQL についてきた ssleay32.dll とそれが依存する libeay32.dll の2つを ruby の bin にコピーしてとりあえず解決。別の問題がおきたらそのときまた考えよう。