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 libxml2
bundle config --delete build.nokogiri
gem uninstall nokogiri libxml-ruby
bundle
这是答案:[***.com/questions/16921700/… [1]:***.com/questions/16921700/…
@NateBerkopec。您的解决方案对我有用,而接受的答案却没有。
1.6.2.1
和 Ubuntu 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。
【讨论】:
我认为不需要link
和unlink
命令。我不用它们就可以逃脱。
请注意,您可能必须在 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.3
、libxml2.2
和libxml2
)。
完成此操作后,运行 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