=== TLDR ===
Zgodnie z instrukcją , zbuduj Rubiego za pomocą najnowszego kompilatora clang lub przynajmniej tej samej wersji, której Rubygems użyje do skompilowania natywnych rozszerzeń Nokogiri libxml i libxsl.
Jeśli używasz RVM, budowanie ze źródła z --with-ggc=clang
flagą było tym, co zrobiło dla mnie:
rvm install 2.2 --with-gcc=clang
Zastąp 2.2
dowolną wersją. --with-gcc=clang
zapewnia, że RVM buduje się ze źródła i używa do tego clang; w przeciwnym razie RVM może mieć wbudowany plik binarny Ruby, co mnie zaskoczyło.
Następnie zainstaluj Nokogiri normalnie za pomocą Bundlera lub Rubygems.
=== W GŁĘBOKOŚCI ===
Przez chwilę walczyłem z tym. gem install nokogiri
dałeś mi:
checking for xmlParseDoc() in libxml/parser.h... no
checking for xmlParseDoc() in -lxml2... no
checking for xmlParseDoc() in -llibxml2... no
Zagłębiając się mkmf.log
, zobaczyłem:
conftest.c:15:27: error: too few arguments to function call, single argument 'cur' was not specified
int t(void) { xmlParseDoc(); return 0; }
Nokogiri dostarcza własne biblioteki libxml i libxsl (od 1.6.4). Podpis zdefiniowany w lokalnej kopii parser.h Nokogiri (znajdującej się w katalogu instalacyjnym gem) to:
xmlParseDoc (const xmlChar *cur);
Nie mogłem więc zrozumieć, w jaki sposób wywołanie metody w hermetycznie zamkniętym pliku conftest.c nie może się równać z plikiem nagłówkowym parser.h.
Kiedy zdałem sobie sprawę, że prawdopodobnie zainstalowałem binarny Ruby, usunąłem i ponownie zainstalowałem za pomocą --with-gcc=clang
(aby wymusić kompilację i użyć clang) i problem został rozwiązany:
rvm uninstall 2.2
rvm install 2.2 --with-gcc=clang
gem install nokogiri
Nie jestem dokładnie pewien, dlaczego to działa, ponieważ nagłówek systemowy libxml /usr/include/libxml2/libxml/parser.h
ma taką samą sygnaturę jak lokalna kopia Nokogiri.
To dziwne, ale zadziałało. Tylko upewnij się, że skompilowałeś Ruby z clang.