=== TLDR ===
Як зазначено в інструкціях , побудуйте Ruby за допомогою останнього компілятора clang або, принаймні, тієї ж версії, яку Rubygems використовуватиме для компіляції власних розширень Nokogiri libxml та libxsl.
Якщо я використовував RVM, --with-ggc=clang
то для мене це було побудувати з джерела з прапором:
rvm install 2.2 --with-gcc=clang
Замініть 2.2
будь-яку версію, яку хочете. --with-gcc=clang
забезпечує збір RVM з джерела та використовує кланг для цього; інакше 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). Підпис, визначений у локальній копії parser.h Nokogiri (знайдений під каталогом встановлення дорогоцінного каміння), є:
xmlParseDoc (const xmlChar *cur);
Тому я був у збитку щодо того, як виклик методу в герметично закритому файлі conftest.c не міг збігатися з файлом заголовка для parser.h.
Коли я зрозумів, що, ймовірно, встановив двійковий Ruby, який я видалив і перевстановив за допомогою --with-gcc=clang
(для примушування компіляції та використання кланг), і проблема була вирішена:
rvm uninstall 2.2
rvm install 2.2 --with-gcc=clang
gem install nokogiri
Я не точно впевнений, чому це працює, оскільки системний заголовок libxml /usr/include/libxml2/libxml/parser.h
має такий же підпис, як локальна копія Nokogiri.
Це дивно, але це спрацювало. Просто переконайтеся, що ви склали Ruby з клангом.