Mac用户遇到警告:Nokogiri是建立在LibXML 2.7.8版本上的,但实际加载的是2.7.3版本。

83

我进行了各种研究并尝试了许多不同的方法。我知道这个问题已经被回答了很多次,但是没有一个建议的解决方案适用于我。

在升级到Lion后,我在Ruby中遇到了分段错误。我相当有信心是Nokogiri的问题,所以我通过Homebrew安装了libxml2。然后我运行了brew link libxml2。接着我使用该库的版本重新安装了Nokogiri。

作为证明:

$ nokogiri -v
# Nokogiri (1.5.0)
---
warnings: []
nokogiri: 1.5.0
ruby:
  version: 1.9.2
  platform: x86_64-darwin11.0.0
  description: ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-darwin11.0.0]
  engine: ruby
libxml:
  binding: extension
  compiled: 2.7.8
  loaded: 2.7.8

我已经在我的Gemfile顶部包含了Nokogiri,并且在我的环境文件中也已经引入了它。我不知道为什么我仍然会收到那个警告。

有什么建议或想法可以确保加载正确版本的libxml2吗?


9
自 Nokogiri 1.6 版本开始,该 gem 已经将 libxml2 打包进去了,所以您可以通过从 Homebrew 中删除 libxml2 来解决此错误。 brew remove --force libxml2 然后执行以下命令来重新配置 bundler:bundle config --delete build.nokogiri 最后卸载 nokogiri 和 libxml-ruby 两个 gem: gem uninstall nokogiri libxml-ruby,然后运行 bundle - Nate Berkopec
这是答案:http://stackoverflow.com/questions/16921700/how-to-load-correct-version-of-dynamic-libraries-and-gems-libxml-nokogiri-wit。 - Mario Uher
@NateBerkopec。你的解决方案对我有用,而被接受的答案则没有。 - egyamado
1.6.2.1和Ubuntu 12.04不兼容。在尝试了所有其他修复方法后,回退到1.6.1解决了问题。 - Damien Roche
16个回答

99
如果您使用gem install nokogiri安装了Nokogiri,则可以通过运行gem pristine nokogiri重新编译gem的C扩展来解决此警告。
如果您使用bundle install安装了Nokogiri,则可以通过运行bundle exec gem pristine nokogiri来重新编译Bundler安装它的位置上的gem的C扩展来解决此警告。

5
太好了,谢谢。bundle exec gem pristine nokogiri 成功了。 - toxaq
1
在Ubuntu 12.04上,我使用动态加载2.7.8版本,虽然警告是基于2.8.0构建的,但对我来说完美运行。 - richard
为了消除在Lion和Rails 3.2.16上的警告,我不得不同时执行'bundle exec gem pristine nokogiri'和将'gem nokogiri'移动到'gem rails'之前。 - jpw
1
这个方法在我的OS X Mavericks上有效,而被接受的答案则不行。 - CBanga
这应该是被接受的答案,而不是可能会砖化您的机器,更不用说极其冗长和令人困惑的东西。 - Greg Blass

58

如果你使用 Homebrew 和 Bundler,可以通过在 Gemfile 文件的顶部添加 gem 'nokogiri' 来解决此问题。然后运行以下命令:

gem uninstall nokogiri libxml-ruby
brew update
brew uninstall libxml2
brew install libxml2 --with-xml2-config
brew install libxslt
bundle config build.nokogiri --with-xml2-include=/usr/local/Cellar/libxml2/2.9.1/include/libxml2 --with-xml2-lib=/usr/local/Cellar/libxml2/2.9.1/lib --with-xslt-dir=/usr/local/Cellar/libxslt/1.1.26/
bundle install
如果您不使用Bundler,请运行以下命令:
gem uninstall nokogiri libxml-ruby
brew update
brew uninstall libxml2
brew install libxml2 --with-xml2-config
brew install libxslt
gem install nokogiri -- --with-xml2-include=/usr/local/Cellar/libxml2/2.9.1/include/libxml2 --with-xml2-lib=/usr/local/Cellar/libxml2/2.9.1/lib --with-xslt-dir=/usr/local/Cellar/libxslt/1.1.26/

在您的应用程序中,您应该首先要求nokogiri,以强制应用程序加载动态的libxml2库,而不是由未能指定要加载哪个库的gem加载的旧版本系统libxml2。


4
你为什么不包括 brew uninstall libxslt - Nate Berkopec
5
对于那些复制粘贴此答案的人,最新版本的libxml2是2.9.0 - 确保在复制粘贴时进行编辑! - Nate Berkopec
7
需要强调的是,最后一句话很重要:“先要求安装nokogiri” 。您可以在Gemfile文件中将nokogiri放在rails之前来完成此操作。 - Wolfram Arnold
如果你不执行 brew link libxml2 libxslt --overwrite --force,那么你可能会使用较新的版本进行编译,但加载的却是当前链接的(可能是旧版本)。 - FernandoEscher
又是一条复制粘贴的警告。如果您完全按照复制粘贴的方式运行这些命令,您必须将libxml2 2.9.0更改为libxml2 2.9.1,如下所示:gem install nokogiri -- --with-xml2-include=/usr/local/Cellar/libxml2/2.8.1/include/libxml2 --with-xml2-lib=/usr/local/Cellar/libxml2/2.8.1/lib --with-xslt-dir=/usr/local/Cellar/libxslt/1.1.26/ - Austin Pray
显示剩余9条评论

39
我刚刚花了大部分时间解决这个警告。这个修复方法适用于使用Mac OS Lion的用户。上面的修复方法使用了...
bundle config build.nokogiri --with-xml2-include=/opt/local/include/libxml2 --with-xml2-lib=/opt/local/lib --with-xslt-dir=/opt/local

适用于通过MacPorts安装了libxml2的Snow Leopard。

对于Lion,libxml2作为引导流程的一部分被加载。无论Nokogiri指向哪个libxml2,Lion系统默认库中的libxml2将在运行时使用。Lion使用位于/usr(而不是/usr/local)的libxml2.2.7.3版本。

正如许多其他地方所提到的,可以忽略该警告。如果像我一样,该警告让您感到疯狂,可以执行以下操作:

bundle config build.nokogiri --with-xml2-dir=/usr --with-xslt-dir=/opt/local --with-iconv-dir=/opt/local

有趣的是,如果你在命令行中输入nokogiri -v,你会得到相反的警告:

WARNING: Nokogiri was built against LibXML version 2.7.3, but has dynamically loaded 2.7.8

这表明 libxml2 的加载方式存在差异,Ruby 和 Rails 使用系统加载的 libxml2,而命令行使用环境路径中的 libxml2。无论如何,这对我来说消除了错误。

我再次强调,此方法仅适用于 Lion 操作系统。之前的修复方法适用于 Snow Leopard 操作系统。

这是答案的结尾,请不要继续阅读。


好吧,你没停下来看…那么...

不推荐!!!!!

你已经被警告了。你可以通过禁用 /usr/lib 中找到的 libxml2 来验证 Mac OSX 是否正在引导加载 libxml2 库。例如,将所有版本的 libxml2*.dylib 复制到 libxml2*.dylib.old 中(在我的机器上为 libxml2.2.7.3libxml2.2libxml2)。

完成后,运行 Nokogiri 将不会产生任何错误。这是因为它找不到已经加载的 libxml2,并且现在将遵循环境路径,最终在 /opt/local 中找到 libxml2.2.7.8

但是你将无法将旧的 libxml 文件复制回去。这是因为操作系统需要在引导中加载的 libxml2。

关机再开机会使你的机器变砖。登录界面将一直挂起。请按单用户模式关机并重新启动(同时按住 Command-S)。你可以观察引导过程。惊讶地发现,它会抛出一个无法加载 libxml2 的错误,然后停止工作。

关机后再次开机。这次进入恢复模式(要么按住 Command-R,要么按住 Option 并选择恢复盘)。在恢复模式下打开终端(utilities/terminal)。将硬盘上的 /usr/lib 挂载(尝试 /Volumes/Macintosh\ HD/usr/lib),并将 libxml2 文件复制回去。重启就没问题了。


1
呵呵...你关于在 /usr 和 /opt/local(MacPorts)之间拆分构建选项的指示对我很有帮助...谢谢。 - Phillip Koebbe
2
我使用了这个解决方案的变种(其中我的动态加载版本是2.9.0):bundle config build.nokogiri --with-xml2-include=/usr/local/Cellar/libxml2/2.9.0/include/libxml2/ - sberkley
感谢@sberkley提供的更新提示。我注意到,当我运行它时,如果在~处执行它,它似乎会全局设置此值。因此,也许您只需执行一次此操作,就再也不必担心它了。 - duma
如果您正在使用 bundler,请确保查看下面 @indirect 的答案。bundle exec gem pristine nokogiri 可能是您想要的。 - Matt Sanders
谢谢,解决了。为了完整起见:在运行上面的bundle config ...命令后,不要忘记重新安装nokogiri gem。 - Philipp
显示剩余2条评论

28

这些方法都不适用于我。

我使用brew安装了更高版本(2.7.8)的libxml2,导致nokogiri编译时与该版本产生冲突。解决方法:先移除它,然后重新编译、安装。

以下是操作步骤:

  • brew uninstall libxml2 (如果之前已安装)
  • gem uninstall nokogiri
  • gem install nokogiri
  • brew install libxml2 (可选)

3
在我的OS X 10.8.2系统上,使用libxml 2.7.8 / 2.8.0时,这个方法解决了我的问题。仅仅删除nokogiri宝石并重新安装并不能解决问题,但是提前运行brew uninstall libxml2却可以。谢谢! - stereoscott
1
完美答案如果使用Homebrew。 - awenkhh
此外,如果有其他人使用RubyMine,并且遇到了在RubyMine中执行bundle install时出现的错误,这是我用来解决该问题的方法。如果您在命令行中键入rake --tasks,则可以看到相同的错误。 - Nate Cook
这对我来说是正确的解决方案。我正在运行Mountain Lion并使用homebrew(和Intellij IDEA)。 - duma
我尝试过使用brew uninstall libxml2,但是出现了错误:Error: No such keg: /usr/local/Cellar/libxml2。但是在Mac OS X Mavericks上,使用brew install libxml2 libxslt对我有效。 - Canbey Bilgili
显示剩余2条评论

16

在我升级到Mountain Lion之后,解决方案(对我来说)变得更加简单:

gem uninstall nokogiri
# (and ignore the warnings about dependencies)
gem install nokogiri

4
感谢反馈,老手。我鼓励您重新阅读 SO 权限问答(Privileges Q&A)。“只要遇到明显草率、毫无努力的帖子或明显且可能危险的错误回答,就请使用您的负评。”这个回答显然对包括原帖作者在内的几个人有效,因此我认为它不值得被负评。 - IAmNaN
1
由于最近发现的CPU消耗DOS漏洞(http://www.vuxml.org/freebsd/843a4641-9816-11e2-9c51-080027019be0.html),我们在FreeBSD上更新了libxml2,导致了所提出的**nokogiri警告**。按照描述重新安装即可解决问题。 - user569825
在我的OSX 10.8.5上有效。 - steakchaser
1
不是的,@Tass。更新只是检查宝石是否有新版本,在这种情况下没有。已经过去两年多了,但我似乎记得在不运行卸载的情况下,更新是一个NOP。我怀疑nokogiri的版本不会改变,但在升级操作系统后需要使用不同的头文件编译库。顺便说一句,这种方法现在已经在几次OSX更新后成功运行了。 - IAmNaN

9
根据上面patrickmcgraw的评论,我只需将nokogiri放在Gemfile的第一行即可。我将其作为单独的答案发布,因为原始评论已被埋没。
source 'http://rubygems.org'
gem 'nokogiri'
gem 'rails', '3.0.20'
etc...

1
关于为什么这个能够工作的解释,请参考@Jarrett的这个回答 - Jared Beck
耶!帮我解决了“警告:Nokogiri是针对LibXML版本2.8.0构建的,但已动态加载2.7.8”的问题。 - Artem Aminov

4
Bundler有设置默认构建位置的选项。例如,通过macports安装了libxml2:
$ bundle config build.nokogiri --with-xml2-include=/opt/local/include/libxml2 --with-xml2-lib=/opt/local/lib --with-xslt-dir=/opt/local

做完这些并运行 bundle install 后,警告就消失了。在 nokogiri wiki 上还有一些设置构建选项的有用示例。

4

看起来您在安装gem后更新了系统库,因此您需要更新Nokogiri。要使用当前的lib版本:

 gem install nokogiri -- --use-system-libraries

2

我有类似的问题,是这样解决的:

在我的情况下,我安装了RVM,并且有@global和@project gem集。两个都安装了nokogiri,其中一个使用不同的libxml构建。

重新构建它们(我有理由这样做)解决了问题。

希望这可以帮到你。


1
gem uninstall nokogiri
bundle  #install nokogiri again

如果出现“libxml2 is missing.”的错误,并且你看到gems/nokogiri-1.5.0/ext/nokogiri/mkmf.log尝试使用“/usr/bin/gcc-4.2 ...”,那么你缺少/usr/bin/gcc-4.2。
解决方案:
sudo ln -s /usr/bin/gcc /usr/bin/gcc-4.2

之前:

$ ll /usr/bin/gcc*
lrwxr-xr-x  1 root  wheel  12 Jan 15 00:16 /usr/bin/gcc -> llvm-gcc-4.2

之后:

$ ll /usr/bin/gcc*
lrwxr-xr-x  1 root  wheel  12 Jan 15 00:16 /usr/bin/gcc -> llvm-gcc-4.2
lrwxr-xr-x  1 root  wheel  12 Jan 15 21:07 /usr/bin/gcc-4.2 -> /usr/bin/gcc

如果你真的缺少libxml2 libxslt,那么
brew update
brew install libxml2 libxslt
brew link libxml2 libxslt
bundle config build.nokogiri --with-xml2-include=/usr/local/Cellar/libxml2/2.8.0/include/libxml2/ --with-xml2-lib=/usr/local/Cellar/libxml2/2.8.0/lib/ --with-xslt-dir=/usr/local/Cellar/libxslt/1.1.26/
bundle

FYI:我正在使用Mountain Lion操作系统,同时安装了brew和bundler。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接