2010-06-13 79 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

相關問題