如何用mkmf.log安装Nokogiri Ruby gem,说没有找到libiconv?

joe*_*son 28 ruby gem install nokogiri

我正在安装Ruby Nokogiri gem并在下面找到错误.

如何诊断并解决它?

# gem install nokogiri
Building native extensions.  This could take a while...
ERROR:  Error installing nokogiri:
ERROR: Failed to build gem native extension.
...
/opt/ruby/1.9.3-p194/bin/ruby extconf.rb
checking for libxml/parser.h... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.
...
/opt/ruby/1.9.3-p194/lib/ruby/1.9.1/mkmf.rb:381:in `try_do': 
The compiler failed to generate an executable file. (RuntimeError)
You have to install development tools first.
from /opt/ruby/1.9.3-p194/lib/ruby/1.9.1/mkmf.rb:506:in `try_cpp'
...
Run Code Online (Sandbox Code Playgroud)

joe*_*son 63

要诊断和解决,这对我有用.

要找出失败的内容,请转到ruby gems目录.

例如:

$ cd <MY RUBY DIRECTORY>/lib/ruby/gems/2.0.0/gems
Run Code Online (Sandbox Code Playgroud)

如果您不知道您的gem目录,请尝试以下方法:

$ echo $GEM_HOME
/opt/gems/2.0.0
$ cd /opt/gems/2.0.0/gems
Run Code Online (Sandbox Code Playgroud)

我安装的是什么版本的nokogiri?

$ ls -ladg nokogiri-*
nokogiri-1.5.5
Run Code Online (Sandbox Code Playgroud)

转到安装程序目录:

$ cd nokogiri-1.5.5/ext/nokogiri
Run Code Online (Sandbox Code Playgroud)

尝试手动安装:

$ ruby extconf.rb
Run Code Online (Sandbox Code Playgroud)

结果:

checking for libxml/parser.h... *** extconf.rb failed ***
...
Run Code Online (Sandbox Code Playgroud)

我正在使用Ubuntu所以我搜索任何类似的包:

$ aptitude search libxml
Run Code Online (Sandbox Code Playgroud)

结果:

p libxml2 - GNOME XML library
p libxml2-dev - Development files for the GNOME XML library
...
Run Code Online (Sandbox Code Playgroud)

我相信libxml2会正常工作.

$ apt-get install libxml2
Run Code Online (Sandbox Code Playgroud)

Ruby原生宝石通常需要标头的*-dev包,所以安装它们:

$ apt-get install libxml2-dev
Run Code Online (Sandbox Code Playgroud)

我现在有解析器文件吗?

$ find / | grep libxml/parser.h
Run Code Online (Sandbox Code Playgroud)

是的,结果显示了解析器:

/usr/include/libxml2/libxml/parser.h
Run Code Online (Sandbox Code Playgroud)

现在再次尝试安装,这次提供了libxml2路径:

$ gem install nokogiri -- --with-xml2-dir=/usr/include/libxml2
Run Code Online (Sandbox Code Playgroud)

它仍然失败,所以请阅读mkmf错误日志:

$ more mkmf.log 
Run Code Online (Sandbox Code Playgroud)

错误日志显示失败的内容,并且这些行看起来很有希望:

package configuration for libxslt is not found
Run Code Online (Sandbox Code Playgroud)

有包裹吗?

$ aptitude search libxslt
Run Code Online (Sandbox Code Playgroud)

结果:

v   libxslt-dev
i   libxslt-ruby
...
Run Code Online (Sandbox Code Playgroud)

安装dev包:

$ apt-get install libxslt-dev
Run Code Online (Sandbox Code Playgroud)

现在再次尝试安装,并将xslt放在路径上:

$ gem install nokogiri -- \
--with-xml2-dir=/usr/include/libxml2 \
--with-xslt-dir=/usr/include/libxslt
Run Code Online (Sandbox Code Playgroud)

成功!

  • 天哪,这个答案需要被提名为EVAR的最佳答案之一.您不仅提供答案,还提供了获得答案的方法.谢谢! (13认同)

not*_*tch 10

安装Nokogiri网站

'安装Nokogiri'是一个致力于在主要平台上安装Nokogiri的网站 - 以下是关于在Ubuntu上安装Nokogiri的摘录:

因为Nokogiri需要针对libxml2和libxslt进行编译和动态链接,所以它因安装复杂而赢得了声誉.

从Nokogiri 1.6开始,libxml2和libxslt源代码与Nokogiri捆绑在一起,并在gem-install-time编译.本文档中的说明适用于所有版本1.6.4及更高版本.

Ubuntu/Debian

使用Nokogiri出售的libxml2和libxslt在Ubuntu和Debian上安装Just Work™:

gem install nokogiri
Run Code Online (Sandbox Code Playgroud)

[...]

使用系统库

如果您想使用系统的libxml2,libxslt和相关库,而不是Nokogiri的销售库,请首先了解您可能要求Nokogiri使用不受支持的libxml2版本.

sudo apt-get install pkg-config
gem install nokogiri -- --use-system-libraries
Run Code Online (Sandbox Code Playgroud)

仅供参考 - 我正在使用Nokogiri 1.6.6.2并且它不仅仅是"正常工作".我明白了--use-system-libraries.


Mac OS X.

该网站的建议还涵盖OS X - 这对我有用:
gem update --system xcode-select --install gem install nokogiri


结论

如果您在任何平台上遇到Nokogiri问题,请查看该网站.