=== TLDR ===
Как указано в инструкциях , соберите Ruby с последним компилятором clang или, по крайней мере, той же версией, которую Rubygems будет использовать для компиляции собственных расширений Nokogiri libxml и libxsl.
Если я использовал RVM, то сборка из источника с --with-ggc=clang
флагом была для меня такой:
rvm install 2.2 --with-gcc=clang
Замените 2.2
на любую версию, которую вы хотите. --with-gcc=clang
обеспечивает сборку RVM из исходного кода и использует для этого clang; в противном случае RVM может предустановить бинарный Ruby, что меня и подвело.
Затем установите Nokogiri как обычно, используя Bundler или Rubygems.
=== В ГЛУБИНЕ ===
Я боролся с этим некоторое время. 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 .
Это странно, но это сработало. Просто убедитесь, что вы собрали Ruby с Clang.