在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
今天下午在配置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嘛。
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论