Nokogiri installation fails -libxml2 is missing

前端 未结 19 2314
情书的邮戳
情书的邮戳 2020-11-27 10:22

I always worked my way around Nokogiri installation issues by following the documentation in the \"Installing Nokogiri\" tutorial.

But this time, even after installi

相关标签:
19条回答
  • 2020-11-27 11:00

    === TLDR ===

    As the instructions state, build Ruby with the latest clang compiler, or at least the same version that Rubygems will use to compile Nokogiri's native extensions libxml and libxsl.

    If using RVM, building from source with the --with-ggc=clang flag was what did it for me:

    rvm install 2.2 --with-gcc=clang
    

    Replace 2.2 with whatever version you want. --with-gcc=clang ensures RVM builds from source and uses clang to do so; otherwise RVM may a pre-built binary Ruby, which is what tripped me up.

    Then, install Nokogiri as normal using Bundler or Rubygems.

    === IN DEPTH ===

    I struggled with this for a while. gem install nokogiri gave me:

    checking for xmlParseDoc() in libxml/parser.h... no
    checking for xmlParseDoc() in -lxml2... no
    checking for xmlParseDoc() in -llibxml2... no
    

    Digging into mkmf.log I saw:

    conftest.c:15:27: error: too few arguments to function call, single argument 'cur' was not specified
    int t(void) { xmlParseDoc(); return 0; }  
    

    Nokogiri supplies its own libxml and libxsl (as of 1.6.4). The signature defined in Nokogiri's local copy of parser.h (found under the gem install directory) is:

    xmlParseDoc (const xmlChar *cur);                                                                                                                                                                                
    

    So I was at a loss as to how the method call in the hermetically sealed conftest.c file usage couldn't match up with the header file for parser.h.

    When I realized I had probably installed a binary Ruby I removed and reinstalled using --with-gcc=clang (to force compilation and use clang) and the problem was solved:

    rvm uninstall 2.2
    rvm install 2.2 --with-gcc=clang
    gem install nokogiri
    

    I'm not exactly sure why that works as the system libxml header /usr/include/libxml2/libxml/parser.h has the same signature as Nokogiri's local copy.

    It's weird, but it worked. Just make sure you compile a Ruby with clang.

    0 讨论(0)
提交回复
热议问题