=== TLDR ===
根据说明,使用最新的clang编译器或至少与Rubygems用来编译Nokogiri的本机扩展libxml和libxsl的版本相同的版本来构建Ruby。
如果使用RVM,则从带有--with-ggc=clang
标志的源构建对我来说是什么:
rvm install 2.2 --with-gcc=clang
替换2.2
为所需的任何版本。--with-gcc=clang
确保RVM从源构建并使用clang进行构建;否则,RVM可能是预构建的二进制Ruby,这让我大跌眼镜。
然后,使用Bundler或Rubygems正常安装Nokogiri。
===深度===
我为此挣扎了一段时间。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安装目录下)中定义的签名为:
xmlParseDoc (const xmlChar *cur);
因此,对于密封的conftest.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。