Flicker1985's Blog

Everything should be made as simple as possible, but not simpler.
多ruby版本环境下no such file to load解决办法

  今天下午在配置ruby开发环境时,发现一个非常trick的问题---当我们启动rails环境时会报no such file to load : iconv。

       因为我们的开发环境比较复杂,而且是基于一个legacy的系统,所以我们需要多个ruby版本。在这种情况下rvm自然成为了我们的首选目标。我当时的情况就是我需要2个不同的ree(ruby enterprise edition),一个是1.8.7-2010.02,另外一个是1.8.7-2011-03。刚开始的时候只要后面这个版本在启动rails时报no such file to load, 后来在我一怒之下卸载了rvm,然后重新安装之后发现两个版本同时报no such file to load, 当时我一下子就瞎菜了。

  休息了一下子,我google了一下发现我应该是缺少了libiconv这个组件,下载之后

  tar xzvf libconv.tar.gz

      cd libconv-1.31.1

      ./configure --prefix=/usr/local/

      make && make install

     安装了之后,

      ls /usr/local/include/ | grep 'iconv.h' 

  检查安装是否成功。安装了iconv的组件,但是它此时还是一个系统的组件,我们的ruby并无法直接调用它。要让ruby能够直接调用它我们就需要对这个组件生成一个ruby能够调用的wrapper。此时,我们需要进入到我们的ruby源代码目录下的ext(在rvm安装的ruby应该是在~/.rvm/src/ree-1.8.7-2010.02/source/ext)目录中,在这个目录你能够看到很多东西,这些东西都是ruby对os中不同组件的调用的代码。这里我们需要的是iconv,我们就进入到iconv目录中,然后执行:

 ruby extconf.rb --with-iconv-dir=/usr/local/ #如果你的liconv不是安装在默认路径,这里需要指明你的libconv的安装目录,否则生成的make文件是无效的

   make && make install

这里有一个点要特别注意就是,在执行这些脚本之前确定你的ruby版本,如果你进入到了ree-1.8.7-2010.02的ext/iconv去调用ree-1.8.7-2011.03去执行编译,显然是不work的。

 其他的类似错误报no such file to load:zlib或者ssh,解决方法都是一致的。


 刚开始的时候觉得,为什么这些ext目录的东东不在ruby开始编译时就检查系统依赖,然后直接编译,如果没有这些依赖直接报错。后来想了想,似乎并不是所有情况下我们都需要这ext,所以用到时候再编译似乎也是有道理的,因为这些东西毕竟不是core,只是ext嘛。     

  


  


posted on 2011-07-21 23:56  Fei He  阅读(1377)  评论(0编辑  收藏  举报