【Ruby】【Mac】require 時dlerrorが発生する
RVMとRubyを入れなおした際、pg(postgresql用のgem)で「libpq.5.dylibがないよー」というエラーが発生してしまいました。
LoadError: dlopen(/Users/ユーザ/.rvm/gems/ruby-1.9.3-p125/gems/pg-0.13.2/lib/pg_ext.bundle, 9): Library not loaded: /Library/PostgreSQL/9.0/lib/libpq.5.dylib Referenced from: /Users/ユーザ/.rvm/gems/ruby-1.9.3-p125/gems/pg-0.13.2/lib/pg_ext.bundle Reason: image not found - /Users/ユーザ/.rvm/gems/ruby-1.9.3-p125/gems/pg-0.13.2/lib/pg_ext.bundle
というようなエラーが出た場合、ダイナミックにリンクするべきライブラリ(=外部にあるファイル)が見つからなかった、という事のようです。(Windows使ってる人には、DLLが見つからないのとほぼ同じと思えば分かりやすいかも)
上記エラーは、install_name_toolというのを使って適切なライブラリファイルに設定し直せば解消します。
#直すのに丸一日かかっちゃった。。(´・ω・`)
手順1:
「ないよー」と言われているファイルが存在することを確認します。
postgresql をワンクリックインストーラでインストールしていた場合、libpq.5.dylibは/Library/PostgreSQL/9.0/lib/ 以下にありましたので、そのパスを設定するようにします。
手順2:
otoolというのを使って、現在設定されているファイルパスを調査します。
otool -L /Users/ユーザ/.rvm/gems/ruby-1.9.3-p125/gems/pg-0.13.2/lib/pg_ext.bundle
このようにすると、該当するgemが外部参照しているパスが表示されます:
/Users/ユーザ/.rvm/rubies/ruby-1.9.3-p125/lib/libruby.1.9.1.dylib (compatibility version 1.9.1, current version 1.9.1) libpq.5.dylib /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11) /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0)
ということで、libpq.5.dylibが相対パスで指定されてますね。。そこにlibpq.5.dylibがないのが問題ようです。
手順3:
libpq.5.dylibのロードパスを変更します。変更にはinstall_name_toolというのを使います。
sudo install_name_tool -change libpq.5.dylib /Library/PostgreSQL/9.0/lib/libpq.5.dylib /Users/ユーザ/.rvm/gems/ruby-1.9.3-p125/gems/pg-0.13.2/lib/pg_ext.bundle
以上により、外部ライブラリのパスが変更され、require可能になります。