为什么在Mac OS上安装Nokogiri会失败并提示缺少libiconv?

163

我一直在尝试在Mac OS 10.9.3上安装Nokogiri,无论我尝试什么方法,安装最终都会以以下错误消息失败:

$ sudo 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.28 --with-iconv-include=/usr/local/Cellar/libiconv/1.14/include --with-iconv-lib=/usr/local/Cellar/libiconv/1.14/lib
Building native extensions with: '--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.28 --with-iconv-include=/usr/local/Cellar/libiconv/1.14/include --with-iconv-lib=/usr/local/Cellar/libiconv/1.14/lib'
This could take a while...
Building nokogiri using packaged libraries.
ERROR:  Error installing nokogiri:
    ERROR: Failed to build gem native extension.

    /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby extconf.rb --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.28 --with-iconv-include=/usr/local/Cellar/libiconv/1.14/include --with-iconv-lib=/usr/local/Cellar/libiconv/1.14/lib
Building nokogiri using packaged libraries.
checking for iconv.h... yes
checking for iconv_open() in iconv.h... no
checking for iconv_open() in -liconv... no
checking for libiconv_open() in iconv.h... no
checking for libiconv_open() in -liconv... no
-----
libiconv is missing.  please visit http://nokogiri.org/tutorials/installing_nokogiri.html for help with installing dependencies.
-----
*** 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.

Provided configuration options:
    --with-opt-dir
    --without-opt-dir
    --with-opt-include
    --without-opt-include=${opt-dir}/include
    --with-opt-lib
    --without-opt-lib=${opt-dir}/lib
    --with-make-prog
    --without-make-prog
    --srcdir=.
    --curdir
    --ruby=/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby
    --help
    --clean
    --use-system-libraries
    --enable-static
    --disable-static
    --with-zlib-dir
    --without-zlib-dir
    --with-zlib-include
    --without-zlib-include=${zlib-dir}/include
    --with-zlib-lib
    --without-zlib-lib=${zlib-dir}/lib
    --enable-cross-build
    --disable-cross-build


Gem files will remain installed in /Library/Ruby/Gems/2.0.0/gems/nokogiri-1.6.2.1 for inspection.
Results logged to /Library/Ruby/Gems/2.0.0/gems/nokogiri-1.6.2.1/ext/nokogiri/gem_make.out

在网上找到很多帮助,包括使用brew构建和安装libxml2和libxslt,以及从源代码构建libiconv(如" Installing Nokogiri "中所述),但错误仍然存在。

尝试运行Nokogiri的安装时,libxml2和libxslt似乎被正确找到,但未发现libiconv。

有更好了解这些问题的人知道如何安装Nokogiri吗?


您没有展示您试图使用的确切命令,因此我们将在回答问题时盲目尝试。我总是使用 gem install nokogiri,然后我使用 RVM 来管理我的 Mac OS Ruby 安装。libxml 和 libxslt 与 iconv 无关,因此我建议您在 Nokogiri-talk 上提问,那是他们的支持论坛。我安装 Nokogiri 时不记得有任何 iconv 问题,而且我在很多机器上都安装了它。 - the Tin Man
1
我已经在 GitHub 上开了一个工单:https://github.com/tenderlove/nokogiri/issues/442,其中包含了更多的信息。 - polarblau
2
这是一个解决在OSX El Capitan上相同问题的链接,http://estebantorr.es/blog/2015/10/02/Nokogiri-in-El-Capitan/ - sbs
请勿使用sudo安装gem或修改默认的Ruby。相反,使用rbenv或RVM来管理单独的Ruby。这在Stack Overflow上已经多次讨论过。要安装nokogiri,请键入"gem install nokogiri"。 - the Tin Man
你在安装 Nokogiri 之前尝试过卸载 xz 吗?参考链接 - lifeisfoo
33个回答

241

我曾经遇到了同样的问题。不幸的是,"安装Nokogiri"没有涵盖Iconv问题。以下是我解决这个问题的步骤。

首先安装Homebrew,它会让你的生活更加轻松。如果你已经安装了它,请确保通过更新来获取最新的配方:

brew update

注意:在 OSX 10.9+ 版本中,您可能需要安装 xCode 命令工具才能安装 libiconv。

xcode-select --install

然后安装一个更新版本的libiconv。

brew install libiconv

然后安装你的 gem

gem install nokogiri -- --with-iconv-dir=/usr/local/Cellar/libiconv/1.14

5
我安装了"brew install libiconv" 和 "brew link libiconv"之后,成功地安装了nokogiri。我希望这意味着我没有强制依赖于brew安装的特定版本的libiconv。 - Steven Chanin
88
当我尝试运行“brew install libiconv”时,它会输出以下内容:错误:libiconv没有可用的配方。 Apple在OS X中分发libiconv,您可以在/usr/lib中找到它。 某些构建脚本无法正确检测它,请检查现有的配方以获取解决方案。 - Seth Bro
63
如果您正在运行Mavericks操作系统,您可能需要安装Xcode的命令行工具:xcode-select --install。这个对我解决了问题。 - Michael Stalker
34
如果你仍然无法通过 brew install libiconv 安装正确的公式,请使用以下命令:brew tap homebrew/dupes - jamesdlivesinatree
15
在 OS X Yosemite (10.10) 上,我不需要进行 brew 相关操作,只需运行 xcode-select --install 命令即可解决此问题。 - bjfletcher
显示剩余15条评论

100

尝试使用系统库。新版本的OSX自带libiconv,但默认安装脚本似乎存在问题。

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

编辑:Geoff所提到的,如果使用bundler,可以执行以下操作:

bundle config build.nokogiri --use-system-libraries

5
如果使用bundler - 您可以运行"bundle config build.nokogiri --use-system-libraries"。 - Geoff Evason
1
最终 "bundle config build.nokogiri --use-system-libraries" 成功了。我讨厌这种情况发生。 - nils petersohn
1
在我的Mac OS 10.10 Yosemite上运行良好。 - Lloyd Dewolf
谢谢!这是一个漫长的搜索过程,但它不涉及在我的Mac上添加软件包管理器。顺便说一下,我使用的是Yosemite系统,这仍然有效! - Dave Munger
3
在我的电脑上,Xcode 6.3版本在10.10.3系统上运行失败,错误提示为“需要libxml2版本2.6.21或更高版本!”。我需要安装更新的libxml2版本才能解决这个问题。 - Rivera
显示剩余5条评论

36

@Cory的解决方案包含正确答案,但是在Mavericks上的解决方案比顶部解决方案要简单得多,因此我只会重新发布必要的步骤。

在Mavericks(OSX 10.9+)上:

安装Xcode命令行工具:

xcode-select --install

然后安装您的 gem:

gem install nokogiri

4
适用于Yosemite操作系统。很高兴我向下滚动并没有使用旧的答案。 - yuяi
巨大的时间节省者,感谢这个提示!在Mavericks上对我非常有效。 - ice cream
你试过使用我的解决方案吗? 它不需要安装Xcode。 - Filip Kis
这是来自Nokogiri文档(http://www.nokogiri.org/tutorials/installing_nokogiri.html#mac_os_x)的官方解决方案,也是唯一在El Capitan上有效的解决方案。已接受的解决方案在那里不起作用。 - Johannes
在El Capitan上对我有用,真是让人恼火。感谢@Johannes提供的Nokogiri文档链接-非常有用。每个人都应该远离那些建议“使用系统库”的解决方案-这是错误的建议。 - Polsonby
有人知道为什么我在 Mojave 上最近更新到 10.14.4 后会遇到这个问题吗?自至少 Yosemite 以来,我一直通过 bundler 构建 nokogiri 而没有任何问题。现在出了这个问题。是的,XCode 命令行工具已经安装了。谢谢。 - user24601

20

我最终解决了这个问题。以上任何一种解决方案都没有完全解决我的问题。

在尝试在OSX Lion 10.7.2上安装nokogiri时,我遇到了这个错误。首先,这个错误掩盖了真正的问题,因为即使nokogiri找不到libxslt或libxml2,你仍然会得到相同的错误,而在我的情况下,它找不到这两个库。

所以我按照http://nokogiri.org/tutorials/installing_nokogiri.html网站上Homebrew部分的指示进行操作(稍微修改以适应更新版本的libxml2):

brew install libxml2
brew link libxml2

# install libxslt from source
wget ftp://xmlsoft.org/libxml2/libxslt-1.1.26.tar.gz
tar -zxvf libxslt-1.1.26.tar.gz
cd libxslt-1.1.26
./configure --prefix=/usr/local/Cellar/libxslt/1.1.26 --with-libxml-prefix=/usr/local/Cellar/libxml2/2.7.8
make
sudo make install

这时候,我按照nokogiri网站上的指示尝试了一下

gem install nokogiri -- --with-xslt-dir=/usr/local/Cellar/libxslt/1.1.26

然而,这仍然失败了,因为当从源代码构建libxslt时,它会将/include文件夹安装在一个奇怪的位置。因此,您需要分别指定libinclude文件夹,如下所示:

gem install nokogiri -- --with-xslt-lib=/usr/local/Cellar/libxslt/1.1.26/lib --with-xslt-include=/usr/local/Cellar/libxslt/1.1.26/include/libxslt

这个方法仍然不起作用(出现相同的libiconv错误),因此我尝试指定所有三个必需库(libxslt、libxml2和libiconv):

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

现在我遇到了另一种错误!它仍然是一个错误,但至少不同于以前的错误。制作过程失败,出现以下错误:

in /opt/local/lib/libz.1.dylib, file was built for unsupported file format which is not the architecture being linked (x86_64) for architecture x86_64

什么?经过大量搜索,我终于找到了这篇神奇的帖子:http://www.refresherate.com/2010/01/08/fixing-ld-warning-in-usrlocalliblibz-dylib-file-is-not-of-required-architecture/

显然,OSX Lion附带了一些不良版本的libz库( libz.dylib,libz.1.dylib,libz.1.2.4.dylib),需要用来自Xcode SDK的最新版本替换它们。文章解释得比我好,因此请阅读上面的链接以获取具体说明。

一旦这些被替换,我运行

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

重试后一切正常。希望这能帮助其他人。


我曾经遇到过同样的问题,但是我发现从opt/local/lib中删除以下文件:libz.dylib和libz.1.dylib并按照剩下的指示操作就解决了问题。 - Undistraction
1
我认为/opt/local表示MacPorts安装。如果您同时运行homebrew和Macports,则会出现一些奇怪的问题(如您的情况所示)。最好的解决方案是卸载Macports,并使用homebrew作为您的软件包管理器。 - Cory
我在下面为Mavericks(OSX 10.9+)添加了一种新的更简单的解决方案。 - Micah Winkelspecht

18

只是想加入这个人群,但是mkmf.log说找不到x86_64架构的符号。我偶然发现了这个解决方案:

sudo env ARCHFLAGS="-arch x86_64" gem install nokogiri -- --use-system-libraries

可能不能解决原问题,但这可能会对其他人有所帮助。

顺便提一下:nokogiri是我使用Ruby应用的最大障碍。每当有人依赖不同版本时,我都必须弄清楚如何构建它。而且我的问题每次都不同。


1
完全同意你的 Nokogiri 观点。每一次都是这样。 - jbnunn
这种方式对我不起作用,但是 ARCHFLAGS="-arch x86_64" sudo gem install nokogiri -- --use-system-libraries 可以正常工作... - bwoebi
这对我也起作用了,更简单的解决方案,我没有使用ARCHFLAGS,只是sudo gem install nokogiri -- --use-system-libraries。 - ryudice

15

gem install nokogiri -v '1.6.6.2' -- --use-system-libraries --with-xml2-include=$(brew --prefix libxml2)/include/libxml2

这个命令适用于在macos上进行操作。 它也适用于版本 1.6.6.4


在Catalina上,我使用--with-xml2-include选项无法正常工作... gem install nokogiri --version=1.6.6.2 -- --use-system-libraries - ryanc
这在我2021年的Catalina上有效。谢谢! - Евгений Масленков
谢谢!谢谢!谢谢!这是在Big Sur上唯一有效的方法!!! - devjme

6

我正在使用:

操作系统:OS X 10.9.4

Homebrew 版本:0.9.4

这是我从另一个主题总结出的关于成功安装nokogiri并解决缺少libiconv的步骤:

安装Homebrewhttp://brew.sh/ 或者使用下面的命令更新到最新版本

brew update

安装libxml2和libxslt。
brew install libxml2 libxslt

连接libxml2和libxslt库。
brew link libxml2 libxslt

如果收到使用--force的警告,请使用以下命令:
brew link --force libxml2 libxslt

安装xCode命令行工具以使您能够安装libiconv。
xcode-select --install

安装libiconv

wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz
tar xvfz libiconv-1.13.1.tar.gz
cd libiconv-1.13.1
./configure --prefix=/usr/local/Cellar/libiconv/1.13.1
make
sudo make install

最后一步,安装nokogiri!
gem install 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 --with-iconv-include=/usr/local/Cellar/libiconv/1.13.1/include --with-iconv-lib=/usr/local/Cellar/libiconv/1.13.1/lib

5
我在运行 Ruby 2.1.4Yosemite 上解决了这个问题,具体步骤如下:
  1. 确保已安装 xCode 6.1,
  2. xcode-select --install
  3. 在 AppStore 中单击“更新”,安装最新版本的命令行工具(显然 xcode-select --install 无法完成此操作 - 叹息),
  4. 然后 bundle install 就可以像往常一样工作了。
我还执行了 brew install libiconv,但我并不确定是否需要该步骤。

我不认为需要 brew install libiconv -- 我从来没有费心找到正确的软件包,这对我来说工作得很好。当然,可能是因为我之前用 ruby 2.1.1 安装 nokogiri 的时候已经有了它。 - jmstone617
在 AppStore 中点击“更新”,安装最新版本的命令行工具(显然 xcode-select --install 没有完成这个任务 - 唉)。如果没有更新可用,我该如何从 Xcode 更新我的命令行工具?它们不会出现在偏好设置窗格中的“下载”部分。 - chadoh
这个方法对我有效,而无需访问应用商店。我升级了命令行工具和操作系统(至Yosemite),然后运行xcode-select --install,这样我就能安装Nokogiri了。 - steel
我必须执行以下操作:xcode-select --install .. brew install libxml2 .. bundle config build.nokogiri --use-system-libraries .. bundle install - Zack Burt

4

我尝试了很多方法,但都没有起作用。最后我终于找到了iconv文档,它救了我的一天!


3

在查看mkmf文件时,似乎nokogiri(或gem,我不知道)试图在/op/local/中查找依赖项。对我来说,这不是正确的搜索路径。

强制nokogiri在正确的位置查找库(我使用homebrew)对我有帮助:

$ gem install nokogiri -- --with-xslt-dir=/usr/local/Cellar/libxslt/1.1.26 --with-xml2-dir=/usr/local/Cellar/libxml2/2.7.8/

也许nokogiri中有需要修复的问题...
希望对你有帮助,

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接