2010-06-13 35 views
2

我遇到需要'digest/sha1'的问题。Ruby中的LoadError

~$ ./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安装,然后重新安装,但没有帮助。

你知道这个问题是什么以及如何解决它吗?

回答

7

这可能与OpenSSL有关(Ruby使用OpenSSL for MD5/SHA1,至少在可用的情况下)。你可以通过编译一个更新版本的OpenSSL来解决这个问题,并自己连接它(./configure ... --with-openssl-dir=path/to/openssl)。

不幸的是,你不能通过自制软件安装openssl。但是,显然,如果您使用的是macports,则有一个可用端口: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)。

Konstantin

+0

事实上,在RVM的Ruby 1.9.2-head中,我没有需要digest/sha1的问题。但是我仍然想知道从源代码安装时出了什么问题。我也遇到了安装1.9.2-head以外的任何Ruby的问题,但我想这属于一个新的,不同的问题。 – wilhelmtell 2010-06-21 18:10:38

+0

通过彻底删除OpenSSL,我看到在嵌入式Linux系统上修复了这样一个问题。但是这实际上打破了rubygems。 – 2010-06-21 21:39:07

+6

我认为应该是'rvm pkg install openssl'而不是'rvm package install openssl' – Oleander 2012-02-08 00:09:45

相关问题