【问题标题】:"Incompatible library version" on nokogirinokogiri 上的“库版本不兼容”
【发布时间】:2015-09-30 23:05:49
【问题描述】:

我已经升级(apt-upgrade)我的 Ubuntu 14.03 服务器,包括 gitlab-ce。现在我的 Ruby(机架)网站似乎不再工作了。我收到以下错误:

incompatible library version - /home/taco/.rvm/gems/ruby-2.1.2/gems/nokogiri-1.6.6.2/lib/nokogiri/nokogiri.so (LoadError)
/home/taco/.rvm/gems/ruby-2.1.2/gems/nokogiri-1.6.6.2/lib/nokogiri.rb:29:in `require'
/home/taco/.rvm/gems/ruby-2.1.2/gems/nokogiri-1.6.6.2/lib/nokogiri.rb:29:in `rescue in <top (required)>'
/home/taco/.rvm/gems/ruby-2.1.2/gems/nokogiri-1.6.6.2/lib/nokogiri.rb:25:in `<top (required)>'
/home/taco/.rvm/gems/ruby-2.1.2/gems/nokogumbo-1.4.1/lib/nokogumbo.rb:1:in `require'
/home/taco/.rvm/gems/ruby-2.1.2/gems/nokogumbo-1.4.1/lib/nokogumbo.rb:1:in `<top (required)>'
/home/taco/.rvm/gems/ruby-2.1.2/gems/sanitize-4.0.0/lib/sanitize.rb:3:in `require'
/home/taco/.rvm/gems/ruby-2.1.2/gems/sanitize-4.0.0/lib/sanitize.rb:3:in `<top (required)>'
...

我使用 Nginx 运行乘客,它通常可以正常工作,现在仍然可以。 Geminthebox 仍然有效。我认为这与 Nginx 或乘客无关,而“只是”一些无法相处的宝石。有没有人遇到过这类错误?

更新

我的客户网站的功能此时真的不需要清理,所以我禁用了该部分,以使客户网站再次运行。

在那个过程中,我注意到它对 zipruby gem 的说法是一样的。而且我还注意到更多生成此错误的宝石。因此,它不是宝石本身,而是一个底层库。我对产生此错误的 gem 做了一些 ldd,即 nokogiri 上的 ldd

ldd /home/taco/.rvm/gems/ruby-2.1.5/gems/nokogiri-1.6.6.2/lib/nokogiri/nokogiri.so
linux-vdso.so.1 =>  (0x00007fff5b1fd000)
libruby.so.2.1 => /home/taco/.rvm/rubies/ruby-2.1.5/lib/libruby.so.2.1 (0x00007fc4e9ae4000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fc4e97de000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fc4e95c5000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc4e93a7000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc4e8fe2000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fc4e8dde000)
libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007fc4e8ba5000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc4ea3f5000)

我还尝试了 nokogumbo、zipruby、rest-client 和其他几个。我还没找到奇怪的东西。

顺便说一句:正如您可能注意到的,我尝试了几件事,比如通过 rvm 使用不同的 ruby​​ 版本等,所以上面示例中的 ruby​​ 版本有所不同。

【问题讨论】:

    标签: ruby ubuntu nginx nokogiri


    【解决方案1】:

    查看我在系统 (Mac OS X) 上安装的 Nokogiri,我发现 Nokogiri 的 c 扩展部分使用以下库:

    /Users/me/.rvm/rubies/ruby-1.9.3-p550/lib/libruby.1.9.1.dylib (compatibility version 1.9.1, current version 1.9.1)
    /usr/lib/libxml2.2.dylib (compatibility version 10.0.0, current version 10.9.0)
    /usr/lib/libxslt.1.dylib (compatibility version 3.0.0, current version 3.26.0)
    /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
    /usr/lib/libicucore.A.dylib (compatibility version 1.0.0, current version 53.1.0)
    /usr/lib/libexslt.0.dylib (compatibility version 9.0.0, current version 9.15.0)
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
    /usr/local/Cellar/gcc48/4.8.3/lib/gcc/x86_64-apple-darwin14.0.0/4.8.3/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    

    其中我很确定 Nokogiri 在其他平台上使用 libxml2、libxslt、libz、libicucore 和 libexslt。我假设通过升级您的 Ubuntu 版本,它升级了一些与您安装 Nokogiri 的库不同的系统库。

    我要做的是找到您的 Nokogiri gem 安装生成的包含所有 c 代码的库,并在其上运行 ldd。你的系统应该告诉你它是否找到了它试图链接的库。我的猜测是你至少会丢失一个。

    简单的解决方案是重新安装 Nokogiri,以便根据您的新库版本进行编译。

    【讨论】:

    • 尝试重新安装它,但不起作用。也试过--use-system-libraries,但也没有用。然而,我确实做了一个小脚本,只需要'sanitize'和“puts Sanitize.clean('Test')”。这似乎没有问题。猜猜它是宝石的组合......
    • @TacoJanOsinga 也可能是 nokogumbo 下的秋葵解析器问题。如果你发现在 gems 中编译的底层动态库,你能发布 ldd 的输出是什么吗?
    • 我用 ldd 信息更新了这个问题,但这对几个图书馆来说似乎没问题。
    猜你喜欢
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 2016-10-12
    • 2018-10-10
    • 2016-03-11
    • 2021-02-08
    • 2018-05-20
    • 2016-09-18
    相关资源
    最近更新 更多