以前 rvm を Mac OSX にインストールして、いざ rails を実行すると、以下のようなリンクエラーが出る。
$ ./script/server start dyld: lazy symbol binding failed: Symbol not found: _libiconv_open Referenced from: /usr/local/rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/i686-darwin10.7.0/iconv.bundle Expected in: flat namespace dyld: Symbol not found: _libiconv_open Referenced from: /usr/local/rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/i686-darwin10.7.0/iconv.bundle Expected in: flat namespace Trace/BPT trap
これは要するに iconv.bundle がリンクしている先の libiconv ライブラリに存在すべきシンボルが無いという旨のエラー。発生する原因は色々あると思うけど、多いのは独自にライブラリを ports や コンパイルなどでインストールして複数存在する場合に起こる事が多いと思う。
例えば今回の場合は、独自に libiconv を /usr/local にインストールしていたため、 rvm インストール時に使用されたライブラリと、いざ実行したさいにロードしようとしているライブラリが違ってしまっているためエラーが発生する。
解決方法がいくつかあったので、それをメモ。
一番楽で早いのは環境変数で読み込むライブラリの場所を指定してやる方法。
例えば今回の例で iconv.bundle のリンク先を otool で確認すると
$ otool -L /usr/local/rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/i686-darwin10.7.0/iconv.bundle /usr/local/rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/i686-darwin10.7.0/iconv.bundle: /usr/local/rvm/rubies/ruby-1.8.7-p334/lib/libruby.dylib (compatibility version 1.8.0, current version 1.8.7) /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.10) /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0)
となり、どうやら /usr/lib/libiconv.2.dylib を参照している模様。しかし本当にロードしなければいけないのは、 /usr/local/lib/libiconv.2.dylib なので、環境変数 DYLD_LIBRARY_PATH を以下のように指定するとエラーが回避できる。
$ export DYLD_LIBRARY_PATH=/usr/local/lib
ただしこの方法、毎回やるのは面倒だし、かと言って .bash_profile などに追加しておくと、他のアプリケーションが起動しなくなったりする。
なので、もうちょっと直接的な解決方法を考える。
そもそもライブラリ内のリンク情報が間違っているのが問題なのだから、これを書き換えてしまえばいいのではないか?という事で、 install_name_tool を使って書き換えを行う。以下のコマンドを実行する。
$ install_name_tool -change "/usr/lib/libiconv.2.dylib" /usr/local/lib/libiconv.2.dylib /usr/local/rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/i686-darwin10.7.0/iconv.bundle
そして再び otool で確認すると、
$ otool -L /usr/local/rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/i686-darwin10.7.0/iconv.bundle/usr/local/rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/i686-darwin10.7.0/iconv.bundle: /usr/local/rvm/rubies/ruby-1.8.7-p334/lib/libruby.dylib (compatibility version 1.8.0, current version 1.8.7) /usr/local/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.10) /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0)
書き変わってますね。では rails を再び実行してみる。
$ ./script/server start => Booting WEBrick => Rails 2.3.5 application starting on http://0.0.0.0:3000 => Call with -d to detach => Ctrl-C to shutdown server [2011-11-21 14:34:00] INFO WEBrick 1.3.1 [2011-11-21 14:34:00] INFO ruby 1.8.7 (2011-02-18) [i686-darwin10.7.0] [2011-11-21 14:34:00] INFO WEBrick::HTTPServer#start: pid=3506 port=3000
めでたく動きました。