ruby - Por que a instalação do Nokogiri no Mac OS falha com libiconv ausente?



macos libxml2 (20)

@ A solução da Cory contém a resposta correta, mas a solução no Mavericks é na verdade muito mais simples do que a solução principal, então estou repostando apenas com as etapas necessárias.

No Mavericks (OSX 10.9 +):

Instale as ferramentas de linha de comando do Xcode:

xcode-select --install

então instale sua gema:

gem install nokogiri

Eu tenho tentado instalar Nokogiri no Mac OS 10.9.3 e tudo o que eu tento, a instalação falha no final com a seguinte mensagem de erro:

$ sudo gem install nokogiri -- --with-xml2-include=/usr/local/Cellar/libxml2/2.9.1/include/libxml2 --with-xml2-lib=/usr/local/Cellar/libxml2/2.9.1/lib --with-xslt-dir=/usr/local/Cellar/libxslt/1.1.28 --with-iconv-include=/usr/local/Cellar/libiconv/1.14/include --with-iconv-lib=/usr/local/Cellar/libiconv/1.14/lib
Building native extensions with: '--with-xml2-include=/usr/local/Cellar/libxml2/2.9.1/include/libxml2 --with-xml2-lib=/usr/local/Cellar/libxml2/2.9.1/lib --with-xslt-dir=/usr/local/Cellar/libxslt/1.1.28 --with-iconv-include=/usr/local/Cellar/libiconv/1.14/include --with-iconv-lib=/usr/local/Cellar/libiconv/1.14/lib'
This could take a while...
Building nokogiri using packaged libraries.
ERROR:  Error installing nokogiri:
    ERROR: Failed to build gem native extension.

    /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby extconf.rb --with-xml2-include=/usr/local/Cellar/libxml2/2.9.1/include/libxml2 --with-xml2-lib=/usr/local/Cellar/libxml2/2.9.1/lib --with-xslt-dir=/usr/local/Cellar/libxslt/1.1.28 --with-iconv-include=/usr/local/Cellar/libiconv/1.14/include --with-iconv-lib=/usr/local/Cellar/libiconv/1.14/lib
Building nokogiri using packaged libraries.
checking for iconv.h... yes
checking for iconv_open() in iconv.h... no
checking for iconv_open() in -liconv... no
checking for libiconv_open() in iconv.h... no
checking for libiconv_open() in -liconv... no
-----
libiconv is missing.  please visit http://nokogiri.org/tutorials/installing_nokogiri.html for help with installing dependencies.
-----
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
    --with-opt-dir
    --without-opt-dir
    --with-opt-include
    --without-opt-include=${opt-dir}/include
    --with-opt-lib
    --without-opt-lib=${opt-dir}/lib
    --with-make-prog
    --without-make-prog
    --srcdir=.
    --curdir
    --ruby=/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby
    --help
    --clean
    --use-system-libraries
    --enable-static
    --disable-static
    --with-zlib-dir
    --without-zlib-dir
    --with-zlib-include
    --without-zlib-include=${zlib-dir}/include
    --with-zlib-lib
    --without-zlib-lib=${zlib-dir}/lib
    --enable-cross-build
    --disable-cross-build


Gem files will remain installed in /Library/Ruby/Gems/2.0.0/gems/nokogiri-1.6.2.1 for inspection.
Results logged to /Library/Ruby/Gems/2.0.0/gems/nokogiri-1.6.2.1/ext/nokogiri/gem_make.out

Depois de seguir muita ajuda encontrada na web, incluindo a construção e instalação do libxml2 e libxslt usando o brew e a construção do libiconv a partir das fontes (conforme descrito em " Instalando o Nokogiri "), o erro permanece o mesmo.

Ao tentar executar a instalação do Nokogiri, a libxml2 e a libxslt parecem estar bem, mas não libiconv.

Qualquer pessoa com um conhecimento melhor dessas coisas sabe como instalar o Nokogiri?


Apenas adicionando minha voz à multidão, mas mkmf.log disse algo sobre não ser capaz de encontrar símbolos para a arquitetura x86_64. Eu tropecei nesta solução:

sudo env ARCHFLAGS="-arch x86_64" gem install nokogiri -- --use-system-libraries

Pode não resolver nada para o autor da pergunta original, mas isso pode ajudar alguém.

Nota: nokogiri tem sido a minha maior barreira ao uso de aplicações ruby. Toda vez que alguém depende de uma versão diferente, tenho que descobrir como criá-la. E meu problema é diferente a cada vez.


Esta postagem do blog propõe instalar o libiconv manualmente.

Posteriormente, o nokogiri pode ser instalado com um número de switches informando onde encontrar o libiconv (veja o post do blog).

Como uma nota lateral: Depois de instalar o nokogiri, eu consegui instalar o gollum (a instalação também falhou porque não encontrei o iconv). Agora eu ainda estou enfrentando problemas, porque quando eu inicio o gollum, o Python falha.


Este trabalhou para mim

sudo env ARCHFLAGS = "- arch x86_64" gem instalar nokogiri: 1.6.6.2 - --use-system-libraries --with-xml = / usr / local / Cellar / libxml2 / 2.9.3 / --with-iconv- dir = / usr / local / Cellar / libiconv / 1.14


Eu estava lutando com Nokogiri por um tempo hoje no OS X 10.10 Yosemite

Meu ambiente foi confuso por algum motivo.

which bundle e which gem estava me dando /usr/bin/bundle e /usr/bin/gem vez de ~/.rbenv/shims/gem

O que ajudou a corrigi-lo para mim foi sudo rm -i /usr/bin/gem /usr/bin/bundle

Depois disso eu: 1. mudei de volta para o meu diretório de projetos 2. desinstalei o dependente 3. (re) -installed o libs dependentes: fiz um brew install libxml2 libiconv libxslt 4. instalei minha versão ruby ​​fresh (com rbenv) 5. fiz gem install bundler 6. e bundle install correu sem problemas.

Nokogiri estava bem depois disso.

Para referência:

╰─% cat .bundle/config           
---
BUNDLE_PATH: vendor/bundle
BUNDLE_DISABLE_SHARED_GEMS: '1'
BUNDLE_JOBS: 4

╰─% which ruby bundle gem
~/.rbenv/shims/ruby
~/.rbenv/shims/bundle
~/.rbenv/shims/gem

Eu estou usando .. OS X 10.9.4 Homebrew 0.9.4

Aqui está o meu verão deste tópico para instalar o nokogiri com sucesso, consertando libiconv ausente.

Instale Homebrew Homebrew Ou atualize para mais recente usando o comando abaixo

brew update

Instalar libxml2 libxslt

brew install libxml2 libxslt

Vincule ambos libxml2 libxslt

brew link libxml2 libxslt

Se você receber um aviso para usar --force, apenas use o comando abaixo

brew link --force libxml2 libxslt

Instale as ferramentas de comando do xCode para permitir que você instale o libiconv

xcode-select --install

Instalar libiconv

wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz
tar xvfz libiconv-1.13.1.tar.gz
cd libiconv-1.13.1
./configure --prefix=/usr/local/Cellar/libiconv/1.13.1
make
sudo make install

Etapa final, instale o nokogiri!

gem install nokogiri -- --with-xml2-include=/usr/local/Cellar/libxml2/2.8.0/include/libxml2 --with-xml2-lib=/usr/local/Cellar/libxml2/2.8.0/lib --with-xslt-dir=/usr/local/Cellar/libxslt/1.1.26 --with-iconv-include=/usr/local/Cellar/libiconv/1.13.1/include --with-iconv-lib=/usr/local/Cellar/libiconv/1.13.1/lib

Eu recebi este problema quando atualizei meu Mac OS para o Yosemite. Consegui resolver esse problema fazendo:

xcode-select --install
brew uninstall libiconv
brew install libiconv
gem install nokogiri

Eu resolvi isso no Yosemite rodando o Ruby 2.1.4 by

  1. verifique se você tem o xCode 6.1 instalado, então
  2. xcode-select --install , então
  3. Na AppStore, clique em atualizações e instale a versão mais recente das ferramentas de linha de comando (que aparentemente xcode-select --install não faz - suspiro)
  4. então bundle install funcionou normalmente.

Eu também fiz um brew install libiconv também, mas não estou convencido de que esse passo era necessário.


Eu tentei muitas coisas, mas nada funcionou para mim. Então eu finalmente encontrei a documentação do iconv e isso salvou meu dia!


Eu tive o mesmo problema. Infelizmente, o " Instalando o Nokogiri " não cobre problemas do Iconv. Aqui está como eu resolvi o problema.

Primeiro instale o homebrew , isso facilitará sua vida. Se você já o instalou, certifique-se de pegar as fórmulas mais recentes atualizando da seguinte forma:

brew update

Nota : No OSX 10.9+, pode ser necessário instalar as ferramentas de comando xCode para permitir a instalação do libiconv.

xcode-select --install

em seguida, instale uma nova versão do libiconv

brew install libiconv

em seguida, vincule suas novas bibliotecas iconv:

brew link libiconv

então instale sua gema

gem install nokogiri -- --with-iconv-dir=/usr/local/Cellar/libiconv/1.14

Eu tive que instalar o gcc antes de executar ./configure --prefix=/usr/local/Cellar/libiconv/1.13.1


Eu tive um problema semelhante e a resposta aceita costumava funcionar para mim. Agora, no entanto, tenho visto uma nova mensagem de erro em que um comando gmkdir está ausente como nesta pergunta:

gem install nokogiri -v '1.5.11' falhou devido a make: / usr / local / bin / gmkdir: Nenhum arquivo ou diretório

O que funcionou para mim foi primeiro uma pequena limpeza:

brew uninstall libiconv
brew uninstall libxml2
brew uninstall libxslt

E, em seguida, brew unlink libiconv e qualquer outra coisa que você precise desvincular (verifique com brew doctor ). Então, as duas linhas mágicas (copiadas da resposta ligada):

brew install coreutils
gem install nokogiri

No meu caso, (como no scotchi) a construção falhou por causa de uma biblioteca iconv incompatível em / opt / local / lib. Por padrão, o processo de construção do Nokogiri olha primeiro / opt / local. Para forçá-lo a usar um diretório de instalação diferente, / usr / local por exemplo, faça:

gem install nokogiri -- --with-xml2-lib=/usr/local/lib --with-xml2-include=/usr/local/include/libxml2 --with-xslt-lib=/usr/local/lib --with-xslt-include=/usr/local/include

O libiconv foi removido do Homebrew 0.9 Agora é recomendado compilar libiconv a partir do código-fonte, então referencie a instalação quando você instalar o nokogiri gem. Veja as instruções de instalação do Nokogiri na seção Homebrew 0.9 na página de instalação do Nokogiri


Primeiro de tudo, certifique-se de seguir o guia de instalação no nokogiri: http://nokogiri.org/tutorials/installing_nokogiri.html

Depois de ter seguido o guia, ainda tive esse problema. Foi assim que resolvi:

Primeiro de tudo eu instalei iconv usando homebrew: brew install iconv

Então eu desinstalei ruby, felizmente isso é muito fácil com rvm:

rvm uninstall 1.9.2        

Então eu tive que reinstalar o ruby ​​com as seguintes opções:

CC=gcc-4.2 rvm install 1.9.2-p290 --with-iconv-dir=/usr/local/Cellar/libiconv/1.13.1

Então eu crio um gemset com a nova versão do ruby:

rvm use 1.9.[email protected]

Então eu posso finalmente instalar o nokogiri assim:

gem install nokogiri -v=1.4.4 -- --with-xml2-include=/usr/local/Cellar/libxml2/2.7.8/include/libxml2 --with-xml2-lib=/usr/local/Cellar/libxml2/2.7.8/lib --with-xslt-dir=/usr/local/Cellar/libxslt/1.1.26

Procure no arquivo mkmf.log no diretório de compilação da gem (por exemplo, /Library/Ruby/Gems/1.8/gems/nokogiri-1.4.4/ext/nokogiri/mkmf.log). Isso tem muito mais informação. No meu caso, quando acertei, foi que Nokogiri especificamente adicionou / opt / local / lib ao caminho de busca da biblioteca e o GNU Backgammon tinha instalado um libiconv incompatível lá.


Tente usar as bibliotecas do sistema. O OSX vem com libiconv em versões mais recentes, mas o script de instalação padrão parece ter um problema

gem install nokogiri -- --use-system-libraries

Edit: Se usando bundler, como mencionado por Geoff você pode fazer:

bundle config build.nokogiri --use-system-libraries

Você precisa atualizar seu homebrew para 0.9

então siga estes passos

brew install libxml2 libxslt
brew link libxml2 libxslt
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz
tar xvfz libiconv-1.13.1.tar.gz
cd libiconv-1.13.1
./configure --prefix=/usr/local/Cellar/libiconv/1.13.1
make
sudo make install

sudo ln -s /usr/bin/gcc /usr/bin/gcc-4.2

gem install nokogiri -- --with-xml2-include=/usr/local/Cellar/libxml2/2.9.0/include/libxml2 --with-xml2-lib=/usr/local/Cellar/libxml2/2.9.0/lib --with-xslt-dir=/usr/local/Cellar/libxslt/1.1.28 --with-iconv-include=/usr/local/Cellar/libiconv/1.13.1/include --with-iconv-lib=/usr/local/Cellar/libiconv/1.13.1/lib

Você deve verificar novamente a versão da biblioteca de pastas.


UTILIZADORES HOMEBREW

Solução correta para corrigir este problema se você estiver usando homebrew:

xcode-select --install

Escolha "Obter Xcode" na caixa de diálogo.

brew unlink libiconv
gem install nokogiri

A etapa xcode-select corrige sua instalação do Xcode e a instalação do Xcode Command Line Utils. Descobri que não tinha /usr/include/iconv.h devido a algum tipo de problema com upgrades de O / S ou restaurações de backups. Se você não tem esse arquivo de cabeçalho e /usr/lib/libconv.dylib depois de rodar o xcode-select então você provavelmente precisa arrastar o Xcode da pasta do aplicativo para o lixo e reinstalar e baixar manualmente as ferramentas de linha de comando do Xcode de https://developer.apple.com/downloads/index.action e instalar isso.

Então você precisa desvincular o libiconv do homebrew. Você não precisa disso. E o clang vai pegar /usr/local/include/iconv.h em /usr/include/iconv.h e irá #definir iconv_open para libiconv_open, mas então linkar com /usr/lib/libiconv.dylib que não tem libiconv_open que é o que faz com que as falhas do mkmf encontrem libiconv. O que você precisa fazer é remover o link de iconv.h para que o nokogiri não o encontre.

Então apenas construa o nokogiri normalmente.

Para novos usuários, tudo o que você precisa fazer é instalar o xcode com xcode-select e instalar o nokogiri, mas se você encontrou esta questão, presume-se que você tenha uma instalação mal feita e não uma nova instalação do Mavericks.

Algumas das outras respostas aqui estão definitivamente incorretas. A maioria deles tenta usar o libiconv fora do homebrew, o que é totalmente desnecessário. As respostas que brew link libiconv estão realmente causando o problema onde o clang se torna confuso e tenta ler um arquivo de cabeçalho homebrew e link contra as bibliotecas do sistema. As respostas que sugerem --use-system-libraries são ruins porque o nokogiri precisa ser vinculado contra suas bibliotecas libxml2 e libxslt empacotadas porque outras versões dessas bibliotecas são incompatíveis com ele. As respostas que querem que você compile a partir de fontes são apenas excessivamente complicadas.

TL; DR:

  • Atualize e / ou repare sua instalação do Xcode
  • Desvincule sua libiconv homebrew desde que tentar usar isso só causa problemas
  • Construa nokogiri normalmente

USUÁRIOS RVM

Instalações RVM antigas podem ter um libiconv escondido em seus diretórios rvm em algum lugar que esteja em conflito com as bibliotecas do sistema. Consulte https://.com/a/11809261/506908 para mais informações.

USUÁRIOS MacPorts

Se você tiver /opt/local/lib/libiconv.dylib, então o nokogiri adicionará esse caminho à lista de diretórios que ele procura e encontrará a instalação do MacPorts semelhante a como ele pega o libiconv do homebrew e entra em conflito com as bibliotecas do sistema. Podes tentar:

sudo port uninstall libiconv

Se isso falhar devido a dependências, você pode tentar vincular-se diretamente à versão do MacPorts (não testado):

gem install nokogiri -- --with-iconv-dir=/opt/local

$ gem install iconv # works but it is missing an iconv.so file in ruby 2.0.0-p247

$ ls -1 2.0.0-p0/lib/ruby/gems/2.0.0/gems/iconv-1.0.3/*/*/*.so
2.0.0-p0/lib/ruby/gems/2.0.0/gems/iconv-1.0.3/ext/iconv/iconv.so*
2.0.0-p0/lib/ruby/gems/2.0.0/gems/iconv-1.0.3/lib/iconv/iconv.so*

$ ls -1 2.0.0-p247/lib/ruby/gems/2.0.0/gems/iconv-1.0.3/*/*/*.so
2.0.0-p247/lib/ruby/gems/2.0.0/gems/iconv-1.0.3/ext/iconv/iconv.so*

OBSERVE O arquivo /lib/iconv/iconv.so AUSENTE em 2.0.0-p247 presente na instalação das gemas 2.0.0-p0.

$ rbenv version
2.0.0-p247 (set by /home/XXX/tmp/.ruby-version)
$ rbenv which gem
/home/XXX/.rbenv/versions/2.0.0-p247/bin/gem
$ gem --version
1.8.25

$ rbenv which pry
/home/XXX/.rbenv/versions/2.0.0-p247/bin/pry
$ pry
[1] pry(main)> require 'iconv'
LoadError: cannot load such file -- iconv/iconv.so
from /home/XXX/.rbenv/versions/2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36:in `require'

Copie o arquivo

$ pushd ~/.rbenv/versions/
$ cp 2.0.0-p247/lib/ruby/gems/2.0.0/gems/iconv-1.0.3/ext/iconv/iconv.so 2.0.0-p247/lib/ruby/gems/2.0.0/gems/iconv-1.0.3/lib/iconv/

AGORA FUNCIONA!

$ pry
[1] pry(main)> require 'iconv'
=> true




libiconv