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

时间:2011-07-23 18:26:55

标签: ruby macos nokogiri libxml2

我做过各种研究并尝试过很多不同的事情。我知道这个问题已被多次回答,但没有一个建议的解决方案对我有用。

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

16 个答案:

答案 0 :(得分:95)

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

如果您使用bundle install安装了Nokogiri,则可以通过运行bundle exec gem pristine nokogiri来解析此警告,以便在Bundler安装它的任何地方重新编译gem的C扩展。

答案 1 :(得分: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

如果您不使用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。

答案 2 :(得分: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作为引导过程的一部分加载。无论libxml2 Nokogiri指向哪个,libxml2的Lion系统默认库都将在运行时使用。 Lion使用/usr中的libxml2.2.7.3(不是/usr/local)。

正如许多其他地方所提到的,人们可以忽略警告。如果像我一样,警告会让你发疯,那么你可以这样做:

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。无论如何,这让我无法理解错误。

我会再说一遍 - 这只适用于狮子座。之前的修复程序适用于Snow Leopard。

这是答案的结尾。别在这里读。


好的,你没有停止阅读......好吧......

不推荐!!!!!!

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

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

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

关闭电源并重新打开电源会使机器变硬。登录屏幕将挂起并挂起并挂起。在单用户模式下关闭电源并再次打开电源(重新启动时按住 Command - S )。你可以看到引导程序发生。低,看,它抛出一个错误,它无法加载libxml2然后停止工作。

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

答案 3 :(得分:27)

这些都不适合我。

我使用brew安装了更高版本(2.7.8)的libxml2。这导致nokogiri编译反对它和后来的问题。解决方案,删除它,然后构建,然后根据需要安装。

这是有效的:

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

答案 4 :(得分:15)

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

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

答案 5 :(得分:9)

根据上面patrickmcgraw的评论,简单地将nokogiri作为我的Gemfile中的第一个条目为我工作。我把它作为一个单独的答案,因为最初的评论已被埋没。

source 'http://rubygems.org'
gem 'nokogiri'
gem 'rails', '3.0.20'
etc...

答案 6 :(得分: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上设置构建选项。

答案 7 :(得分:4)

在安装gem之后,您似乎已经更新了系统库,因此您必须更新Nokogiri。要使用当前的lib版本:

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

答案 8 :(得分:2)

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

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

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

希望这会有所帮助..

答案 9 :(得分: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。

答案 10 :(得分:1)

gem install libxml-ruby帮助我

答案 11 :(得分:0)

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

以下是我的完整解决方案

我卸载了源代码(来自源目录)

sudo make uninstall

删除包

rm -rf ~/.bundle ~/.bundler

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

sudo ldconfig

然后重新安装捆绑包

bundle install

答案 12 :(得分: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

解释是:“发生这种情况是因为使用了Lion系统默认的libxml2(在引导程序中加载),而不管构建的是哪个libxml2 Nokogiri。”

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

答案 13 :(得分:0)

OS: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"

希望这个帮助

答案 14 :(得分:0)

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

答案 15 :(得分:0)

操作系统:Catalina

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

我遵循了Michiel de Mare steps,但是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