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

Posted

技术标签:

【中文标题】Mac 用户并收到警告:Nokogiri 是针对 LibXML 版本 2.7.8 构建的,但已动态加载 2.7.3【英文标题】:Mac user and getting WARNING: Nokogiri was built against LibXML version 2.7.8, but has dynamically loaded 2.7.3 【发布时间】:2011-10-11 18:11:39 【问题描述】:

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

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

【问题讨论】:

Nokogiri 1.6 及更高版本现在将 libxml2 与 gem 捆绑在一起,因此您只需从 Homebrew 中删除 libxml2 即可修复此错误。 brew remove --force libxml2bundle config --delete build.nokogirigem uninstall nokogiri libxml-rubybundle 这是答案:[***.com/questions/16921700/… [1]:***.com/questions/16921700/… @NateBerkopec。您的解决方案对我有用,而接受的答案却没有。 1.6.2.1Ubuntu 12.04 玩得不好。在尝试了我能找到的所有其他修复后,回到1.6.1 修复了它。 【参考方案1】:

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

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

【讨论】:

太好了,谢谢。 bundle exec gem pristine nokogiri 成功了。 完美地为我工作,警告通过在 Ubuntu 12.04 上动态加载 2.7.8 来针对 2.8.0 构建 要让警告在 Lion 和 rails 3.2.16 上消失,我必须同时执行 'bundle exec gem pristine nokogiri' 并将 'gem nokogiri' 移动到 'gem rails' 之前跨度> 这在 OS X Mavericks 中对我有用,但接受的答案没有。 这应该是公认的答案,而不是可能会使您的机器变砖的东西,更不用说极其冗长和混乱了。【参考方案2】:

如果您使用自制软件和捆绑程序,要解决此问题,请将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。

【讨论】:

我认为不需要linkunlink 命令。我不用它们就可以逃脱。 请注意,您可能必须在 gem 命令前面加上 bundle exec - 例如,如果您使用的是 rbenv 你有什么理由不包括brew uninstall libxslt 对于那些复制粘贴这个答案的人,libxml2 的最新版本是 2.9.0 - 复制粘贴时一定要编辑这个! 值得强调的是最后一句话很重要:首先需要 nokogiri 通过将 nokogiri 放在您的 Gemfile 中的轨道前面来做到这一点。【参考方案3】:

我刚刚度过了上午的大部分时间来处理这个警告。此修复适用于使用 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,libxml2 的 Lion 系统默认库都将在运行时使用。 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文件复制回来。重启,一切都会好的。

【讨论】:

嘿...您在 /usr 和 /opt/local (MacPorts) 之间拆分构建选项的说明为我做了...谢谢 很高兴看到比我聪明的人也触犯了 Apple Bootstrap libxml2 的噩梦 :) 我只是偶然偶然发现了这篇文章,并没有使用它,但是这个详细的答案值得很多人的努力! 我在这个解决方案上使用了一个变体(我的动态加载版本是 2.9.0):bundle config build.nokogiri --with-xml2-include=/usr/local/Cellar/libxml2/2.9.0/include/libxml2/ 感谢@sberkley 更新提示。我注意到,当我运行它时,如果你在~ 执行它,它似乎会全局设置这个值。所以也许你可以只做一次,再也不用担心了。【参考方案4】:

这些都不适合我。

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

以下是有效的:

brew uninstall libxml2 (如果以前安装过) gem uninstall nokogiri gem install nokogiri brew install libxml2 (可选)

【讨论】:

这为我在 OS X 10.8.2 上使用 libxml 2.7.8 / 2.8.0 修复了它。只是删除 nokogiri gem 并重新安装它并没有解决它,但 brew uninstall libxml2 事先已经解决了。谢谢! 如果使用自制软件的完美答案 +1 完美。关键是在安装 nokogiri 时不要安装任何其他版本的 libxml2。 另外,以防万一其他人是 RubyMine,这就是我帮助我修复了在 RubyMine 中使用bundle install 时遇到的错误。如果您输入rake --tasks,您可以在命令行中看到相同的错误 这对我来说是正确的解决方案。我正在运行 Mountain Lion,并且正在使用自制软件(和 Intellij IDEA)。【参考方案5】:

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

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

【讨论】:

感谢您的反馈,老专业。我鼓励您考虑重新阅读 SO Privileges Q&A。 “每当你遇到一个非常草率、不费吹灰之力的帖子,或者一个明显不正确且可能危险地不正确的答案时,请使用你的反对票。”这个答案显然适用于包括 OP 在内的几个人,所以我认为它不值得反对。 由于最近发现的 cpu 消耗 DOS 漏洞 (vuxml.org/freebsd/843a4641-9816-11e2-9c51-080027019be0.html) 我们在 FreeBSD 上更新了 libxml2,导致 nokogiri 警告 有问题。按照说明重新安装,问题解决了。 在 OSX 10.8.5 上为我工作 不,@Tass。 update 只是检查是否有新版本的 gem,在这种情况下没有。已经两年多了,但我似乎记得没有运行卸载,更新是一个 NOP。我怀疑 nokogiri 的版本没有改变,但升级操作系统后需要使用不同的头文件编译库。顺便说一下,这种方法现在在几次 OSX 更新后已经奏效了。【参考方案6】:

根据上面 patrickmcgraw 的评论,简单地将 nokogiri 作为我的 Gemfile 中的第一个条目对我有用。我将其作为单独的答案,因为原始评论已被掩埋。

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

【讨论】:

有关为什么这样的解释,请参阅@Jarrett 的this answer 是的!帮助我“警告:Nokogiri 是针对 LibXML 版本 2.8.0 构建的,但已动态加载 2.7.8”【参考方案7】:

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 上设置构建选项。

【讨论】:

【参考方案8】:

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

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

【讨论】:

【参考方案9】:

我遇到了类似的问题,就这样解决了:

就我而言,我已经安装了 RVM,并且我有 @global 和 @project gem 集。 他们两个都安装了 nokogiri,其中一个是用不同的 libxml 构建的。

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

希望这会有所帮助..

【讨论】:

【参考方案10】:
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

仅供参考:我正在使用 brew 和 bundler 运行 Mountain Lion。

【讨论】:

【参考方案11】:

gem install libxml-ruby 帮助我

【讨论】:

【参考方案12】:

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

以下是我的完整解决方案

我卸载了源码(从源码目录)

sudo make uninstall

移除捆绑包

rm -rf ~/.bundle ~/.bundler

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

sudo ldconfig

然后重新安装包

bundle install

【讨论】:

【参考方案13】:

我自己也遇到了这个问题(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(在引导时加载),无论 Nokogiri 是针对哪个 libxml2 构建的。”

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

【讨论】:

【参考方案14】:

操作系统: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"

希望有帮助

【讨论】:

【参考方案15】:

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

【讨论】:

【参考方案16】:

操作系统:卡特琳娜

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

我关注了Michiel de Maresteps,但 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 时使用了这些目录

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

【讨论】:

以上是关于Mac 用户并收到警告:Nokogiri 是针对 LibXML 版本 2.7.8 构建的,但已动态加载 2.7.3的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Mac OS Sierra 10.12 上安装 Nokogiri

MacOs (M1 Arm64) 无法加载 Nokogiri - 使用系统默认 Ruby

ruby nokogiri gem install mac osx high sierra

我收到针对特定应用程序的 Petalinux 构建警告

了解 Scapy “未找到到达目的地的 Mac 地址。使用广播。”警告

如何通过 Nokogiri 在页面上获取特定的可查看字符串