Nokogiri 安装失败-libxml2丢失

我总是按照“ 安装 Nokogiri”教程中的文档来解决 Nokogiri 的安装问题。

但是这一次,即使安装了所有的依赖项,Nokogiri 仍然没有被安装:

libxml2 is missing.  please visit <http://nokogiri.org/tutorials/installing_nokogiri.html>

我尝试通过指定 libxml2和 libxslt 目录来安装它:

sudo gem install nokogiri -- --with-xml2-include=/usr/include/libxml2 --with-xml2-lib=/usr/lib --with-xslt-dir=/usr/

但它返回了同样的错误。

我关注了所有其他相关的 Stack Overflow 文章,但没有一篇有帮助。有人有解决方案吗?

90845 次浏览

您试过安装 libxml2吗?不是从 Rubygems,而是通过您的操作系统的标准安装过程。比如在 Ubuntu/Debian 上:

sudo apt-get install libxml2

在任何最新版本的 OS X 上,它应该已经被安装了。

首先,安装依赖项:

sudo apt-get install libxslt-dev libxml2-dev

如果仍然收到错误,则可能缺少一个编译器工具链:

sudo apt-get install build-essential

如果缺少构建工具链,就会出现“ libxml2丢失”错误(至少我在 Debian Lenny 上遇到过这个问题)。

Nokogiri build 测试-编译一个 libxml2头文件来验证它是否存在,然而,它没有区分“ libxml2丢失”和“测试 libxml2的编译器丢失”。

您通常需要开发文件来构建 gem:

sudo apt-get install libxslt-dev libxml2-dev

(我刚刚看到埃里克在一条评论中提出了同样的建议。)

实际上,您可能需要同时安装这两个包

sudo apt-get install libxslt-dev libxml2-dev

我刚刚在 Fedora 13上遇到了同样的问题

gem install nokogiri

为我工作,我能够安装它,并通过 yum绕过 libxml2错误。

只需通过 yum而不是 gem命令安装 gem:

su
yum search rubygem-nokogiri   #this find the proper package name
yum install rubygem-nokogiri.i686

这帮助我找到了 Fedora 的正确答案,因为我正在使用 RVM for Ruby 包管理,

yum install rubygem-nokogiri

将把所有的 Ruby 宝石和依赖关系引入到系统中,而不是引入到我的 RVM 环境中,根据我的经验,这将导致一个非常令人沮丧和谦卑的体验。

所以,带着你找到的 Nokogiri 美味宝石,你可以使用:

yum provides  rubygem-nokogiri

并获取 rubygem-Nokogiri 的依赖项列表,这个列表向我展示了缺少的库。之后我跑了:

yum install libxml2-devel libxslt libxslt-devel

现在 Nokogiri 编译在 Fedora 和 Nokogiri 安装。噢!我们需要从 devel 库中编译 Nokogiri 的头文件。

它将是:

sudo yum install -y libxml2 libxml2-devel

在 RHEL 服务器上。

我可以用 巧克力味的、 Windows 8.1 x64和 DevKit x64安装这个软件。

cinst libxml2
cinst libxslt
cinst libiconv


gem install nokogiri --
--with-xml2-include=C:\Chocolatey\lib\libxml2.2.7.8.7\build\native\include
--with-xml2-lib=C:\Chocolatey\lib\libxml2.redist.2.7.8.7\build\native\bin\v110\x64\Release\dynamic\cdecl
--with-iconv-include=C:\Chocolatey\lib\libiconv.1.14.0.11\build\native\include
--with-iconv-lib=C:\Chocolatey\lib\libiconv.redist.1.14.0.11\build\native\bin\v110\x64\Release\dynamic\cdecl
--with-xslt-include=C:\Chocolatey\lib\libxslt.1.1.28.0\build\native\include
--with-xslt-lib=C:\Chocolatey\lib\libxslt.redist.1.1.28.0\build\native\bin\v110\x64\Release\dynamic

您必须验证路径中的版本号是否正确。

您可能需要添加微软的 NuGet 存储库:

-Source "https://go.microsoft.com/fwlink/?LinkID=230477"

在 MacOSX (Mavericks)中,在安装 gem 之前用 brew安装库并设置 NOKOGIRI_USE_SYSTEM_LIBRARIES=1,这对我来说非常有效。

总结:

  • 如果以前已经安装,卸载 gem:

    gem uninstall nokogiri
    
  • Use Homebrew to install libxml2, libxslt and libiconv:

    brew install libxml2 libxslt libiconv
    
  • Install the gem specifying the paths to the libraries to be linked against:

    NOKOGIRI_USE_SYSTEM_LIBRARIES=1 gem install nokogiri -- --use-system-libraries --with-iconv-dir="$(brew --prefix libiconv)" --with-xml2-config="$(brew --prefix libxml2)/bin/xml2-config" --with-xslt-config="$(brew --prefix libxslt)/bin/xslt-config"
    

能够安装流浪者威慑遵循上述职位,但使用命令如下:

NOKOGIRI_USE_SYSTEM_LIBRARIES=1 vagrant plugin install vagrant-aws
gem install nokogiri -- --with-xml2-include=/usr/local/Cellar/libxml2/2.7.8/include/libxml2 --with-xml2-lib=/usr/local/Cellar/libxml2/2.7.8/lib --with-xslt-dir=/usr/local/Cellar/libxslt/1.1.26 --with-iconv-include=/usr/local/Cellar/libiconv/1.14/include --with-iconv-lib=/usr/local/Cellar/libiconv/1.14/lib

用它来改变你的版本。

在 Mac OS X (Mavericks)中,如果这些解决方案都不管用,试试:

ARCHFLAGS="-arch x86_64" gem install nokogiri

或者

ARCHFLAGS="-arch i386" gem install nokogiri

取决于您的系统架构。

我可以在 Fedora 20上安装 Nokogiri 1.6.5:

export NOKOGIRI_USE_SYSTEM_LIBRARIES=true

然后跑步:

gem install nokogiri

在 Mac OS X Yosemite 上,我的错误在于,我试图使用 sudo gem install,而在安装 gem 时不使用超级用户权限是一条经验法则。

在我的例子中,它试图修改 Ruby 的系统安装,这不是一个好主意。我安装了 rbenv,通过它安装了 Ruby 2.2.2,并将其设置为 global,这是 rbenv 文档中的一个术语。之后 Nokogiri 可以安装一个简单的

gem install nokogiri

没有黑客或变通方法是必要的,只是一个适当的设置环境; Nokogiri 做其余的完美。

= = TLDR = =

作为 说明书状态,使用最新的 clang 编译器构建 Ruby,或者至少与 Rubygems 用于编译 Nokogiri 的本地扩展 libxml 和 libxsl 的版本相同。

如果使用 RVM,那么使用 --with-ggc=clang标志从源代码构建对我来说就是这么做的:

rvm install 2.2 --with-gcc=clang

用您想要的任何版本替换 2.2--with-gcc=clang确保 RVM 从源代码构建,并使用 clang 来完成; 否则 RVM 可能是预先构建的二进制 Ruby,这就是我的问题所在。

然后,使用 Bundler 或 Rubygems 正常安装 Nokogiri。

= = = IN DEPTH = =

我为此挣扎了一段时间。 gem install nokogiri给了我:

checking for xmlParseDoc() in libxml/parser.h... no
checking for xmlParseDoc() in -lxml2... no
checking for xmlParseDoc() in -llibxml2... no

深入挖掘 mkmf.log我看到:

conftest.c:15:27: error: too few arguments to function call, single argument 'cur' was not specified
int t(void) { xmlParseDoc(); return 0; }

Nokogiri 提供自己的 libxml 和 libxsl (截至1.6.4)。在 Nokogiri 的 parser.h 本地副本(可以在 gem install 目录下找到)中定义的签名是:

xmlParseDoc (const xmlChar *cur);

因此,我不知道为什么在完全密封的 configtest.c 文件中的方法调用不能与 parser.h 的头文件匹配。

当我意识到我可能已经安装了一个二进制 Ruby,我删除并重新安装使用 --with-gcc=clang(强制编译和使用 clang)和问题得到解决:

rvm uninstall 2.2
rvm install 2.2 --with-gcc=clang
gem install nokogiri

我不太确定为什么 libxml 头文件 /usr/include/libxml2/libxml/parser.h具有与 Nokogiri 的本地副本相同的签名。

这很奇怪,但是很有效。只要确保用 clang 编译了一个 Ruby。

我可以通过运行以下软件包来安装 Nokogiri:

$ dnf group install "C Development Tools and Libraries"
$ dnf install ruby-devel libxml2-devel patch

对于 OSX 用户来说,如果你以前成功地安装了 Nokogiri,但是在安装时出现了错误,比如说,使用新版本的 Ruby,你已经添加了 还有,这个错误包含了如下信息:

The compiler failed to generate an executable file. (RuntimeError)
You have to install development tools first.

这可能意味着 XCode 升级已经通过 App Store 进行,手动或自动进行,从那时起您就没有打开过它。

如果是这样,您应该能够打开 XCode,同意新的许可,然后成功地安装 Nokogiri。

对于其他遇到这个问题的人,我通过在项目目录中运行这个命令解决了这个问题

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

更新: 我再次遇到了这个问题,并试图只是更新的宝石为我工作..。

gem update nokogiri

视窗 x64:

gem inst nokogiri --pre --platform ruby

要了解更多信息,请查看这个帖子: https://github.com/sparklemotion/nokogiri/issues/864

在 macOS 中,直到我明确地提供了到 --with-xml2-include的 XCode libxml2路径之前,上面/下面的内容都没有真正为我工作过。

gem install nokogiri -- --with-xml2-include=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/libxml2 --use-system-libraries