=== TLDR ===
Như trạng thái hướng dẫn , xây dựng Ruby với trình biên dịch clang mới nhất hoặc ít nhất là cùng một phiên bản mà Rubygems sẽ sử dụng để biên dịch các phần mở rộng riêng của Nokogiri libxml và libxsl.
Nếu sử dụng RVM, xây dựng từ nguồn với --with-ggc=clang
cờ là điều đã làm cho tôi:
rvm install 2.2 --with-gcc=clang
Thay thế 2.2
bằng bất cứ phiên bản nào bạn muốn. --with-gcc=clang
đảm bảo RVM xây dựng từ nguồn và sử dụng tiếng kêu để làm như vậy; mặt khác, RVM có thể là một Ruby nhị phân được xây dựng sẵn, đó là thứ đã làm tôi vấp ngã.
Sau đó, cài đặt Nokogiri như bình thường bằng Bundler hoặc Rubygems.
=== TRONG KHO ===
Tôi vật lộn với điều này trong một thời gian. gem install nokogiri
đưa cho tôi:
checking for xmlParseDoc() in libxml/parser.h... no
checking for xmlParseDoc() in -lxml2... no
checking for xmlParseDoc() in -llibxml2... no
Đi sâu vào mkmf.log
tôi đã thấy:
conftest.c:15:27: error: too few arguments to function call, single argument 'cur' was not specified
int t(void) { xmlParseDoc(); return 0; }
Nokogiri cung cấp libxml và libxsl của riêng mình (kể từ 1.6.4). Chữ ký được xác định trong bản sao phân tích cú pháp cục bộ của Nokogiri (được tìm thấy trong thư mục cài đặt đá quý) là:
xmlParseDoc (const xmlChar *cur);
Vì vậy, tôi đã không biết làm thế nào mà cách gọi phương thức trong cách sử dụng tệp conftest.c được niêm phong kín không thể khớp với tệp tiêu đề cho trình phân tích cú pháp.h.
Khi tôi nhận ra có lẽ tôi đã cài đặt một Ruby nhị phân, tôi đã gỡ bỏ và cài đặt lại bằng cách sử dụng --with-gcc=clang
(để buộc biên dịch và sử dụng tiếng kêu) và vấn đề đã được giải quyết:
rvm uninstall 2.2
rvm install 2.2 --with-gcc=clang
gem install nokogiri
Tôi không chắc chắn tại sao điều đó hoạt động như tiêu đề libxml của hệ thống /usr/include/libxml2/libxml/parser.h
có cùng chữ ký với bản sao cục bộ của Nokogiri.
Thật kỳ lạ, nhưng nó đã làm việc. Chỉ cần chắc chắn rằng bạn biên dịch một Ruby với tiếng kêu.