Mac用户并得到警告:Nokogiri是针对LibXML版本2.7.8构建的,但已动态加载2.7.3。


82

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

升级到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

我已经将Nokogiri包含在我的gemfile的顶部,并且在我的环境文件中也需要它。我不知道为什么我仍然收到该警告。

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


9
Nokogiri 1.6及更高版本现在将libxml2与gem捆绑在一起,因此您可以通过从Homebrew中删除libxml2来解决此错误。brew remove --force libxml2 bundle config --delete build.nokogiri gem uninstall nokogiri libxml-ruby bundle
Nate Berkopec 2013年


@NateBerkopec。您的解决方案对我有用,而没有被接受的答案。
egyamado 2014年

1.6.2.1而且Ubuntu 12.04玩的不好。1.6.1在尝试了所有其他可以找到的修复后,退回修复该问题。
Damien Roche 2014年

Answers:


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。

答案到此为止。在这里停止阅读。


好吧,您没有停止阅读...好吧...

不建议!!!!!!

你被警告了。您可以通过禁用中找到的libxml2来验证Mac OSX是否正在其引导程序中加载libxml2库/usr/lib。这样做的复制所有版本的libxml2*.dyliblibxml2*.dylib.old(我的机器上,这是libxml2.2.7.3libxml2.2libxml2)。

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

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

关闭电源并再次打开电源将使您的机器变砖。登录屏幕将挂起并挂起并挂起。关闭电源,然后在单用户模式下再次打开电源(按住Command-S重启时)。您可以观看引导程序的发生。低,请注意,它引发了一个错误,即它无法加载libxml2,然后停止工作。

关闭电源,然后再次打开。这次引导进入恢复模式(按住Command-R或按住Option然后选择恢复磁盘)。在恢复模式下,打开终端(utilities/terminal)。安装/usr/lib在HD上(尝试/Volumes/Macintosh\ HD/usr/lib),然后将libxml2文件复制回去。重新启动,一切都会好的。


1
呵呵...您的指令在/ usr和/ opt / local(MacPorts)之间拆分了构建选项,这对我
有用

很高兴看到有人比我聪明,也被Apple Bootstrap libxml2噩梦困扰:)
Kenton 2012年

我只是偶然地偶然发现了这篇文章,没有任何用处,但是这个详细的答案值得大家的支持!
starcream_disco_party 2012年

2
我对此解决方案使用了一个变体(我的动态加载版本为2.9.0):bundle config build.nokogiri --with-xml2-include=/usr/local/Cellar/libxml2/2.9.0/include/libxml2/
sberkley 2013年

感谢@sberkley提供了更新的提示。我注意到,当我运行它时,如果您在进行操作~,则似乎会全局设置此值。因此,也许您只需执行一次,而不必再担心它。
duma 2013年

97

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

如果您使用来安装Nokogiri bundle install,则可以通过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构建了对我来说完美的工作
Richardard

要获得警告,请停止在Lion and rails 3.2.16上运行,我既要执行“捆绑程序执行程序gem pristine nokogiri”,又要将“ gem nokogiri”移到“ gem rails”之前
jpw

1
这在OS X Mavericks中对我有用,接受的答案没有。
CBanga 2014年

这应该是公认的答案,而不是可能会使您的机器变砖的东西,更不用说过于冗长和混乱了。
格雷格·布拉斯

58

为了解决这个问题,如果你使用自制和打捆,添加gem 'nokogiri' 到顶部你的Gemfile,然后运行以下命令:

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

如果不使用捆绑程序,请运行以下命令:

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库,而不是无法指定要加载哪个库的gems加载的旧系统版本的libxml2。


我认为不需要linkunlink命令。我不用他们就可以脱身。
M. Scott Ford

请注意,您可能必须在gem命令前加上bundle exec-例如,如果您使用rbenv
2012年

4
您有没有任何理由要包括brew uninstall libxslt
Nate Berkopec 2012年

5
对于那些复制粘贴此答案的人,最新版本的libxml2是2.9.0-请确保在复制粘贴时对其进行编辑!
Nate Berkopec

7
值得一提的是,最后一句很重要:首先需要nokogiri可以通过在您的Gemfile中将nokogiri放在rails之前来做到这一点。
Wolfram Arnold

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 gem并重新安装它并不能解决问题,但brew uninstall libxml2事先可以解决。谢谢!
立体

1
如果使用自制软件,则是一个完美的答案
awenkhh 2013年

+1完美。关键是在安装nokogiri时不要安装任何其他版本的libxml2。
Nate Cook 2013年

另外,以防万一其他人是RubyMine,这就是我帮助我解决了bundle install从RubyMine中遇到的错误的原因。如果键入rake --tasks
Nate Cook

这对我来说是正确的解决方案。我正在运行Mountain Lion,正在使用自制软件(和Intellij IDEA)。
duma 2013年

16

更新到Mountain Lion之后的解决方案(对我而言)要简单得多:

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

4
感谢您的反馈,Old Pro。我鼓励您考虑重新阅读《 SO特权》问答。“每当遇到过分草率,不费力气的帖子,或者答案显然是错误的,甚至可能是危险的错误答案时,请使用低调投票。” 这个答案显然对包括OP在内的许多人都有效,所以我认为它不值得一票。
IAmNaN 2013年

1
由于最近发现了CPU消耗DOS漏洞(vuxml.org/freebsd/843a4641-9816-11e2-9c51-080027019be0.html),我们在FreeBSD上更新了libxml2,从而引起了有关nokogiri警告的问题。按照说明进行重新安装,解决了该问题。
user569825 2013年

在OSX 10.8.5上为我工作
牛排追逐者”,2014年

1
不,@ Tass。update只是检查是否有gem的新版本,在这种情况下没有。已经有两年多了,但是我似乎记得没有运行卸载,更新是NOP。我怀疑nokogiri的版本没有改变,但是在升级OS之后,库需要用不同的头文件进行编译。
IAmNaN 2014年

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”。并且您看到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

仅供参考:我正在与Brew和打捆机一起经营Mountain Lion。



0

我实际上安装了两个版本的libxml,一个来自源代码,一个来自RPM。

以下是我的完整解决方案

我卸载了源(从源目录)

sudo make uninstall

删除捆绑

rm -rf ~/.bundle ~/.bundler

更新的LD(可能必须以root身份而不是sudo身份执行此操作)

sudo ldconfig

然后重新安装捆绑包

bundle install

0

我自己就遇到了这个问题(OS X Lion 10.7.5)。我的确切信息是:Nokogiri是针对LibXML 2.8.0版构建的,但已动态加载2.7.3。

我尝试了此处提到的一些建议,但没有奏效,但确实做到了:

gem install nokogiri -- --with-xml2-dir=/usr --with-xslt-dir=/opt/local --with-iconv-dir=/opt/local

解释是:“发生这种情况是因为无论使用哪个Lionxml2 Nokogiri,都使用Lion系统默认的libxml2(在引导程序中加载)。”

致谢:https : //coderwall.com/p/o5ewia


0

操作系统:Maverick 10.9.3

Ruby 1.9.3

警告:Nokogiri是针对LibXML版本2.9.1构建的,但已动态加载2.9.0。

我的解决方案:

gem uninstall nokogiri
brew update
cd /usr/local
brew versions libxml2
git checkout 5dd45d7 /usr/local/Library/Formula/libxml2.rb # libxml version 2.9.0
brew install libxml2
bundle install or gem install nokogiri -v "1.5.11"

希望这个帮助


0

如果您收到此消息,并且您的nokogiri已与gem来源中提供的版本过时,则只需运行bundle update nokogiri以获取新代码并重新编译即可。您的错误应该消失。


0

操作系统:Catalina

警告:警告nokogiri是针对libxml版本2.9.10构建的,但已动态加载2.9.4

我按照Michiel de Mare的 步骤进行操作,但是brew install libxml2 --with-xml2-config失败,出现无效选项错误。因此,我安装了libxml2和libxslt并记下了这两个命令的输出。

 brew install libxml2                   
==> Downloading https://homebrew.bintray.com/bottles/libxml2-2.9.10_2.catalina.bottle.tar.gz
Already downloaded: /Users/alberto/Library/Caches/Homebrew/downloads/9ddf5cb90fd16a7eb531e37bb748fd392f30214d9fe1568b2b70d28cc368c8f7--libxml2-2.9.10_2.catalina.bottle.tar.gz
==> Pouring libxml2-2.9.10_2.catalina.bottle.tar.gz
==> Caveats
libxml2 is keg-only, which means it was not symlinked into /usr/local,
because macOS already provides this software and installing another version in
parallel can cause all kinds of trouble.

If you need to have libxml2 first in your PATH run:
  echo 'export PATH="/usr/local/opt/libxml2/bin:$PATH"' >> ~/.zshrc

For compilers to find libxml2 you may need to set:
  export LDFLAGS="-L/usr/local/opt/libxml2/lib"
  export CPPFLAGS="-I/usr/local/opt/libxml2/include"

For pkg-config to find libxml2 you may need to set:
  export PKG_CONFIG_PATH="/usr/local/opt/libxml2/lib/pkgconfig"

==> Summary
🍺  /usr/local/Cellar/libxml2/2.9.10_2: 280 files, 10.6MB

brew install libxslt
==> Downloading https://homebrew.bintray.com/bottles/libxslt-1.1.34.catalina.bottle.tar.gz
==> Downloading from https://d29vzk4ow07wi7.cloudfront.net/cbadecf3186f45754220dff4cbdfbb576882a211d615b52249a4c9d8ba4d7c3a?response-content-disposition=attachment%3Bfil
######################################################################## 100.0%
==> Pouring libxslt-1.1.34.catalina.bottle.tar.gz
==> Caveats
To allow the nokogiri gem to link against this libxslt run:
  gem install nokogiri -- --with-xslt-dir=/usr/local/opt/libxslt

libxslt is keg-only, which means it was not symlinked into /usr/local,
because macOS already provides this software and installing another version in
parallel can cause all kinds of trouble.

If you need to have libxslt first in your PATH run:
  echo 'export PATH="/usr/local/opt/libxslt/bin:$PATH"' >> ~/.zshrc

For compilers to find libxslt you may need to set:
  export LDFLAGS="-L/usr/local/opt/libxslt/lib"
  export CPPFLAGS="-I/usr/local/opt/libxslt/include"

For pkg-config to find libxslt you may need to set:
  export PKG_CONFIG_PATH="/usr/local/opt/libxslt/lib/pkgconfig"

==> Summary
🍺  /usr/local/Cellar/libxslt/1.1.34: 136 files, 2.8MB

我在为nokogiri配置捆绑软件时使用了这些目录

bundle config build.nokogiri --with-xml2-include=/usr/local/opt/libxml2/include --with-xml2-lib=/usr/local/opt/libxml2/lib --with-xslt-dir=/usr/local/opt/libxslt

总而言之,我执行了这些步骤

gem uninstall nokogiri libxml-ruby
brew update
brew uninstall libxml2
brew install libxml2
brew install libxslt
bundle config build.nokogiri --with-xml2-include=/usr/local/opt/libxml2/include --with-xml2-lib=/usr/local/opt/libxml2/lib --with-xslt-dir=/usr/local/opt/libxslt
bundle install
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.