Ruby中的LoadError

时间:2010-06-13 14:42:41

标签: ruby

我遇到了需要'digest/sha1'的问题。

~$ ./configure --prefix=$HOME/usr --program-suffix=19 --enable-shared
~$ make
~$ make install
~$ irb19
irb(main):001:0> require 'digest/sha1'
LoadError: dlopen(/Users/matan/usr/lib/ruby19/1.9.1/i386-darwin9.8.0/digest/sha1.bundle, 9): Symbol not found: _rb_Digest_SHA1_Finish
  Referenced from: /Users/matan/usr/lib/ruby19/1.9.1/i386-darwin9.8.0/digest/sha1.bundle
  Expected in: flat namespace
 - /Users/matan/usr/lib/ruby19/1.9.1/i386-darwin9.8.0/digest/sha1.bundle
    from (irb):1:in `require'
    from (irb):1
    from /Users/matan/usr/bin/irb19:12:in `<main>'
irb(main):002:0> 

我知道一些标准模块需要很好,而其他标准模块则不需要。如果我说require 'yaml'甚至require 'digest'那么这样就行了。我使用的是OS X 10.5.8,Ruby 1.9.1-p378。系统范围的Ruby 1.8.6安装工作正常。

就在上周,我卸载了Ruby并重新安装了它。当我第一次安装Ruby时,我以类似的方式安装它,来自我本地$HOME/usr目录的前缀。我尝试删除每个文件make install安装,然后重新安装,但这没有帮助。

您是否知道问题是什么以及如何解决?

1 个答案:

答案 0 :(得分:7)

这可能与OpenSSL有关(Ruby使用OpenSSL for MD5 / SHA1,至少如果可用的话)。您可以通过编译较新版本的OpenSSL并自行链接(./configure ... --with-openssl-dir=path/to/openssl)来解决此问题。

很遗憾,您无法通过自制软件安装openssl。但是,显然,如果您使用的是macport,则可以使用以下端口:sudo port install openssl

但我建议只使用RVM

bash < <( curl http://rvm.beginrescueend.com/releases/rvm-install-head )
rvm package install openssl
rvm install 1.9.1 -C --with-openssl-dir=$HOME/.rvm/usr

然后您可以在1.8和1.9之间切换:

rvm use system
ruby --version # => 1.8
rvm use 1.9.1
ruby --version # => 1.9.1

我自己做了很长时间的编译,甚至编写了我自己的小脚本来管理更新。但是RVM在处理这个方面要好得多。如果您打算尝试使用RVM,只需在freenode的#rvm频道播放,人们总是愿意帮助那里。

顺便说一句,1.9.1有很多粗糙的边缘,我宁愿建议切换到1.9.2分支(或者至少在发布时切换到1.9.2p0)。

康斯坦丁