Usuario de Mac y recibe ADVERTENCIA: Nokogiri fue construido contra LibXML versión 2.7.8, pero ha cargado dinámicamente 2.7.3

82

He hecho todo tipo de investigaciones y he probado muchas cosas diferentes. Sé que esta pregunta ha sido respondida muchas veces, pero ninguna de las soluciones sugeridas me funciona.

Después de actualizar a Lion, recibo fallas de segmentación en Ruby. Estoy bastante seguro de que es Nokogiri. Así que instalé libxml2 a través de Homebrew. Yo corrí brew link libxml2. Luego reinstalé Nokogiri usando esa versión de la biblioteca.

Como prueba:

$ nokogiri -v
# Nokogiri (1.5.0)
---
warnings: []
nokogiri: 1.5.0
ruby:
  version: 1.9.2
  platform: x86_64-darwin11.0.0
  description: ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-darwin11.0.0]
  engine: ruby
libxml:
  binding: extension
  compiled: 2.7.8
  loaded: 2.7.8

Ya he incluido Nokogiri en la parte superior de mi archivo de gemas y también lo he requerido en mi archivo de entorno. No tengo idea de por qué sigo recibiendo esa advertencia.

¿Alguna sugerencia o idea para asegurarse de que está cargando la versión correcta libxml2?

Lógica binaria
fuente
9
Nokogiri 1.6 y superior ahora incluye libxml2 con la gema, por lo que puede corregir este error simplemente eliminando libxml2 de Homebrew. brew remove --force libxml2 bundle config --delete build.nokogiri gem uninstall nokogiri libxml-ruby bundle
Nate Berkopec
@NateBerkopec. Su solución funcionó para mí, mientras que la respuesta aceptada no lo hizo.
egyamado
1.6.2.1y Ubuntu 12.04no juegues bien. Volviendo a 1.6.1arreglarlo después de probar todas las demás soluciones que pude encontrar.
Damien Roche

Respuestas:

39

Pasé la mayor parte de la mañana trabajando en esta advertencia. Esta solución es para personas que usan Mac OS Lion. La corrección anterior usando

bundle config build.nokogiri --with-xml2-include=/opt/local/include/libxml2 --with-xml2-lib=/opt/local/lib --with-xslt-dir=/opt/local

es para Snow Leopard con libxml2 instalado a través de MacPorts.

Con Lion, libxml2 se carga como parte del proceso de arranque. Independientemente de a qué libxml2 Nokogiri esté apuntando, la biblioteca predeterminada del sistema Lion para libxml2 se utilizará en tiempo de ejecución. Lion usa libxml2.2.7.3 que se encuentra en /usr(not /usr/local).

Como se mencionó en muchos otros lugares, uno puede simplemente ignorar la advertencia. Si, como yo, la advertencia te vuelve loco, puedes hacer esto:

bundle config build.nokogiri --with-xml2-dir=/usr --with-xslt-dir=/opt/local --with-iconv-dir=/opt/local

Curiosamente, si escribe nokogiri -ven la línea de comando, obtendrá la advertencia opuesta:

WARNING: Nokogiri was built against LibXML version 2.7.3, but has dynamically loaded 2.7.8

Esto sugiere que hay más sobre cómo se carga libxml2, con Ruby y Rails usando el sistema cargado libxml2 y la línea de comando usando libxml2 desde la ruta del entorno. De todos modos, esto silencia el error para mí.

Lo diré de nuevo, esto es solo para Lion. La solución anterior funcionará para Snow Leopard.

Este es el final de la respuesta. Deja de leer aquí.


OK, no dejaste de leer ... bueno ...

¡¡¡¡¡¡NO RECOMENDADO!!!!!!

Usted ha sido advertido. Puede verificar que Mac OSX esté cargando la biblioteca libxml2 en su bootstrap deshabilitando libxml2 que se encuentra en /usr/lib. Haga algo como copiar todas las versiones de libxml2*.dylibto libxml2*.dylib.old(en mi máquina esto era libxml2.2.7.3, libxml2.2y libxml2).

Una vez hecho esto, la ejecución de Nokogiri no producirá ningún error. Esto se debe a que no puede encontrar el libxml2 cargado y ahora seguirá la ruta del entorno, eventualmente encontrando libxml2.2.7.8en /opt/local.

PERO no podrá volver a copiar los archivos libxml antiguos. Esto se debe a que el sistema operativo necesita libxml2 que se cargó en el bootstrap.

Apagar y encender de nuevo bloqueará su máquina. La pantalla de inicio de sesión se colgará, se colgará y se colgará. Apague y encienda nuevamente en modo de usuario único (mantenga presionado Command- Smientras se reinicia). Puede ver cómo se produce el arranque. Bajo y he aquí, arroja un error de que no puede cargar libxml2 y luego deja de funcionar.

Apague y encienda de nuevo. Esta vez inicie en modo de recuperación (mantenga presionado Command- Ro mantenga presionado Optiony luego seleccione el disco de recuperación). En modo de recuperación abra el terminal ( utilities/terminal). Montar /usr/liben su disco duro (TRY /Volumes/Macintosh\ HD/usr/lib) y copiar los archivos libxml2 espalda. Reinicie y todo estará bien.

Kenton
fuente
1
je ... sus instrucciones para dividir las opciones de compilación entre / usr y / opt / local (MacPorts) lo hicieron por mí ... gracias
Phillip Koebbe
Me alegra ver a alguien más inteligente que yo también caí en conflicto con la pesadilla de Apple libxml2 Bootstrap :)
Kenton
Me encontré con esta publicación al azar y no la usé, ¡pero esta respuesta detallada merece muchos votos a favor por el esfuerzo!
starscream_disco_party
2
Usé una variación de esta solución (donde mi versión cargada dinámicamente era 2.9.0):bundle config build.nokogiri --with-xml2-include=/usr/local/Cellar/libxml2/2.9.0/include/libxml2/
sberkley
Gracias a @sberkley por el consejo actualizado. Noté, cuando lo ejecuté, que si lo hace en ~, parece establecer este valor globalmente. Entonces, tal vez pueda hacer esto una vez y nunca más tendrá que preocuparse por eso.
duma
97

Si instaló Nokogiri con gem install nokogiri, puede resolver esta advertencia ejecutando gem pristine nokogiripara recompilar la extensión C de la gema.

Si instaló Nokogiri con bundle install, puede resolver esta advertencia ejecutando bundle exec gem pristine nokogiripara recompilar la extensión C de la gema dondequiera que Bundler la haya instalado.

indirecto
fuente
5
Excelente gracias. bundle exec gem pristine nokogirijusto en el clavo.
toxaq
1
Funcionado perfectamente para mí con la advertencia sobre el que se construye contra la 2.8.0 por la carga dinámica 2.7.8 en Ubuntu 12.04
Richard
para obtener la advertencia de irse en Lion y rails 3.2.16, tuve que hacer tanto 'bundle exec gem pristine nokogiri' como también mover 'gem nokogiri' por delante de 'gem rails'
jpw
1
Esto funcionó para mí en OS X Mavericks, la respuesta aceptada no.
CBanga
Esta debería ser la respuesta aceptada, no algo que potencialmente podría bloquear su máquina, y mucho menos ser extremadamente detallado y confuso.
Greg Blass
58

Para solucionar este problema, si está usando homebrew y bundler, agregue gem 'nokogiri' a la parte superior de su Gemfile, luego ejecute estos comandos:

gem uninstall nokogiri libxml-ruby
brew update
brew uninstall libxml2
brew install libxml2 --with-xml2-config
brew install libxslt
bundle config build.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.26/
bundle install

Si no usa bundler, ejecute estos comandos en su lugar:

gem uninstall nokogiri libxml-ruby
brew update
brew uninstall libxml2
brew install libxml2 --with-xml2-config
brew install libxslt
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.26/

En su aplicación, primero debe requerir nokogiri , para forzar a la aplicación a cargar la biblioteca dinámica libxml2 en lugar de la versión anterior del sistema libxml2 cargada por gemas que no especificaron qué biblioteca cargar.

Michiel de Mare
fuente
No creo que los comandos linky unlinksean necesarios. Pude escapar sin usarlos.
M. Scott Ford
tenga en cuenta que es posible que deba anteponer los gemcomandos con bundle exec, por ejemplo, si está utilizando rbenv.
asimétrico
4
¿Hay alguna razón por la que no lo incluyas brew uninstall libxslt?
Nate Berkopec
5
Para aquellos que copian y pegan esta respuesta, la última versión de libxml2 es 2.9.0; ¡asegúrese de editar esto al copiar y pegar!
Nate Berkopec
7
Cabe destacar que la última oración es importante: requiere nokogiri primero. Haz esto colocando nokogiri en tu Gemfile antes de los rieles.
Wolfram Arnold
28

Nada de esto funcionó para mí.

Tenía libxml2 instalado en una versión posterior (2.7.8) con brew. Esto hizo que nokogiri se compilara contra él y los problemas posteriores. Solución, elimínela, compile y luego instálela si lo desea.

Esto es lo que funcionó:

  • brew uninstall libxml2 (si se instaló previamente)
  • gem uninstall nokogiri
  • gem install nokogiri
  • brew install libxml2 (Opcional)
nkadwa
fuente
3
Esto me lo solucionó en OS X 10.8.2 con libxml 2.7.8 / 2.8.0. Simplemente quitar la gema nokogiri y reinstalarla no lo resolvió, pero de brew uninstall libxml2antemano lo hizo. ¡Gracias!
stereoscott
1
respuesta perfecta si usa homebrew
awenkhh
+1 Perfecto. La clave es NO tener ninguna otra versión de libxml2 instalada cuando instale nokogiri.
Nate Cook
Además, en caso de que alguien más sea RubyMine, esto es lo que me ayudó a solucionar el error que estaba obteniendo bundle installdesde RubyMine. Puede ver el mismo error en la línea de comando si escriberake --tasks
Nate Cook
Esta fue la solución correcta para mí. Estoy ejecutando Mountain Lion y estoy usando homebrew (e Intellij IDEA).
duma
16

La solución (para mí) después de actualizar a Mountain Lion fue mucho más simple:

gem uninstall nokogiri
# (and ignore the warnings about dependencies)
gem install nokogiri
IAmNaN
fuente
4
Gracias por los comentarios, viejo profesional. Le animo a que considere volver a leer las preguntas y respuestas de SO Privileges. "Utilice sus votos negativos siempre que se encuentre con una publicación atrozmente descuidada, sin esfuerzo, o una respuesta que sea clara y quizás peligrosamente incorrecta". Esta respuesta claramente funcionó para varias personas, incluido el OP, por lo que no creo que justifique un voto negativo.
IAmNaN
1
Debido a la vulnerabilidad DOS de consumo de CPU recientemente descubierta ( vuxml.org/freebsd/843a4641-9816-11e2-9c51-080027019be0.html ), actualizamos libxml2 en FreeBSD, lo que provocó la advertencia de nokogiri en cuestión. Reinstalar como se describe, resolvió el problema.
user569825
Trabajó para mí en OSX 10.8.5
steakchaser
1
No, @Tass. update simplemente comprueba si hay una nueva versión de la gema, que no existe en este caso. Han pasado más de dos años, pero creo recordar que sin ejecutar la desinstalación, la actualización fue un NOP. Sospecho que la versión de nokogiri no cambia, pero las librerías deben compilarse con diferentes encabezados después de actualizar el sistema operativo. Este método, por cierto, ha funcionado después de varias actualizaciones de OSX ahora.
IAmNaN
9

Según el comentario de patrickmcgraw anterior, simplemente poner nokogiri como la primera entrada en mi Gemfile funcionó para mí. Lo pongo como una respuesta separada porque el comentario original ha sido enterrado.

source 'http://rubygems.org'
gem 'nokogiri'
gem 'rails', '3.0.20'
etc...
Shaun
fuente
1
Para obtener una explicación de por qué esto funciona, vea esta respuesta de @Jarrett
Jared Beck
¡Si! Me ayuda con 'ADVERTENCIA: Nokogiri fue construido contra LibXML versión 2.8.0, pero ha cargado dinámicamente 2.7.8'
Artem Aminov
4

Bundler tiene opciones para establecer las ubicaciones de construcción predeterminadas. Entonces, por ejemplo, con libxml2 instalado a través de macports:

$ bundle config build.nokogiri --with-xml2-include=/opt/local/include/libxml2 --with-xml2-lib=/opt/local/lib --with-xslt-dir=/opt/local

Después de hacer esto y bundle install, la advertencia desapareció.

También hay algunos ejemplos útiles para configurar las opciones de compilación en la wiki de nokogiri .

foz
fuente
4

Parece que ha actualizado las bibliotecas de su sistema después de instalar la gema, por lo que debe actualizar Nokogiri. Para usar la versión lib actual:

 gem install nokogiri -- --use-system-libraries
raittes
fuente
2

Tuve un problema similar y lo resolví de esta manera:

En mi caso, tengo RVM instalado y tenía conjuntos de gemas @global y @project. Ambos tenían instalado nokogiri y uno de ellos había construido con diferentes libxml.

La reconstrucción de ambos (tengo motivos para hacer esto) resolvió el problema.

Espero que esto ayude..

shigeya
fuente
1
gem uninstall nokogiri
bundle  #install nokogiri again

Si eso falla con "falta libxml2". y ves gems / nokogiri-1.5.0 / ext / nokogiri / mkmf.log intentando usar "/usr/bin/gcc-4.2 ...", entonces te falta /usr/bin/gcc-4.2

Solución:

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

Antes de:

$ ll /usr/bin/gcc*
lrwxr-xr-x  1 root  wheel  12 Jan 15 00:16 /usr/bin/gcc -> llvm-gcc-4.2

Después:

$ ll /usr/bin/gcc*
lrwxr-xr-x  1 root  wheel  12 Jan 15 00:16 /usr/bin/gcc -> llvm-gcc-4.2
lrwxr-xr-x  1 root  wheel  12 Jan 15 21:07 /usr/bin/gcc-4.2 -> /usr/bin/gcc

Si realmente te falta libxml2 libxslt, entonces

brew update
brew install libxml2 libxslt
brew link libxml2 libxslt
bundle config build.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/
bundle

FYI: Estoy ejecutando Mountain Lion con brebaje y empaque.

Konyak
fuente
1

gem install libxml-ruby me ayuda

bmalets
fuente
0

De hecho, tenía 2 versiones de libxml instaladas, una de origen y otra de RPM.

La siguiente es mi solución completa

Desinstalé la fuente (del directorio de fuentes)

sudo make uninstall

Quitar paquetes

rm -rf ~/.bundle ~/.bundler

LD actualizado (puede que tenga que hacer esto como root, no como sudo)

sudo ldconfig

Luego reinstaló el paquete

bundle install
jessebs
fuente
0

Me encontré con esto yo mismo (OS X Lion 10.7.5). Mi mensaje exacto fue: Nokogiri fue construido contra LibXML versión 2.8.0, pero ha cargado dinámicamente 2.7.3

Probé algunas sugerencias mencionadas aquí, ninguna funcionó, pero esto funcionó:

gem install nokogiri -- --with-xml2-dir=/usr --with-xslt-dir=/opt/local --with-iconv-dir=/opt/local

La explicación es: "Esto sucede porque se usa la libxml2 predeterminada del sistema Lion (cargada en el arranque), independientemente de para qué libxml2 Nokogiri se haya construido".

Créditos a: https://coderwall.com/p/o5ewia

Arta
fuente
0

SO: Maverick 10.9.3

Ruby 1.9.3

ADVERTENCIA: Nokogiri fue construido contra LibXML versión 2.9.1, pero ha cargado dinámicamente 2.9.0

Mi solución:

gem uninstall nokogiri
brew update
cd /usr/local
brew versions libxml2
git checkout 5dd45d7 /usr/local/Library/Formula/libxml2.rb # libxml version 2.9.0
brew install libxml2
bundle install or gem install nokogiri -v "1.5.11"

Espero que esto ayude

Phan Trung Kien
fuente
0

Si tiene este mensaje y su nokogiri está desactualizado con la versión disponible en la fuente de la gema, simplemente ejecute bundle update nokogiripara obtener el nuevo código y recompilarlo. Tu error debería desaparecer.

Martin Streicher
fuente
0

SO: Catalina

Advertencia: la advertencia nokogiri se creó con la versión 2.9.10 de libxml pero se cargó dinámicamente 2.9.4

Seguí los pasos de Michiel de Mare , pero brew install libxml2 --with-xml2-config falló con un error de opción no válida. Así que instalé libxml2 y libxslt y tomé nota del resultado de ambos comandos.

 brew install libxml2                   
==> Downloading https://homebrew.bintray.com/bottles/libxml2-2.9.10_2.catalina.bottle.tar.gz
Already downloaded: /Users/alberto/Library/Caches/Homebrew/downloads/9ddf5cb90fd16a7eb531e37bb748fd392f30214d9fe1568b2b70d28cc368c8f7--libxml2-2.9.10_2.catalina.bottle.tar.gz
==> Pouring libxml2-2.9.10_2.catalina.bottle.tar.gz
==> Caveats
libxml2 is keg-only, which means it was not symlinked into /usr/local,
because macOS already provides this software and installing another version in
parallel can cause all kinds of trouble.

If you need to have libxml2 first in your PATH run:
  echo 'export PATH="/usr/local/opt/libxml2/bin:$PATH"' >> ~/.zshrc

For compilers to find libxml2 you may need to set:
  export LDFLAGS="-L/usr/local/opt/libxml2/lib"
  export CPPFLAGS="-I/usr/local/opt/libxml2/include"

For pkg-config to find libxml2 you may need to set:
  export PKG_CONFIG_PATH="/usr/local/opt/libxml2/lib/pkgconfig"

==> Summary
🍺  /usr/local/Cellar/libxml2/2.9.10_2: 280 files, 10.6MB

brew install libxslt
==> Downloading https://homebrew.bintray.com/bottles/libxslt-1.1.34.catalina.bottle.tar.gz
==> Downloading from https://d29vzk4ow07wi7.cloudfront.net/cbadecf3186f45754220dff4cbdfbb576882a211d615b52249a4c9d8ba4d7c3a?response-content-disposition=attachment%3Bfil
######################################################################## 100.0%
==> Pouring libxslt-1.1.34.catalina.bottle.tar.gz
==> Caveats
To allow the nokogiri gem to link against this libxslt run:
  gem install nokogiri -- --with-xslt-dir=/usr/local/opt/libxslt

libxslt is keg-only, which means it was not symlinked into /usr/local,
because macOS already provides this software and installing another version in
parallel can cause all kinds of trouble.

If you need to have libxslt first in your PATH run:
  echo 'export PATH="/usr/local/opt/libxslt/bin:$PATH"' >> ~/.zshrc

For compilers to find libxslt you may need to set:
  export LDFLAGS="-L/usr/local/opt/libxslt/lib"
  export CPPFLAGS="-I/usr/local/opt/libxslt/include"

For pkg-config to find libxslt you may need to set:
  export PKG_CONFIG_PATH="/usr/local/opt/libxslt/lib/pkgconfig"

==> Summary
🍺  /usr/local/Cellar/libxslt/1.1.34: 136 files, 2.8MB

Y usé esos directorios al configurar el paquete para nokogiri

bundle config build.nokogiri --with-xml2-include=/usr/local/opt/libxml2/include --with-xml2-lib=/usr/local/opt/libxml2/lib --with-xslt-dir=/usr/local/opt/libxslt

Para resumir, ejecuté estos pasos

gem uninstall nokogiri libxml-ruby
brew update
brew uninstall libxml2
brew install libxml2
brew install libxslt
bundle config build.nokogiri --with-xml2-include=/usr/local/opt/libxml2/include --with-xml2-lib=/usr/local/opt/libxml2/lib --with-xslt-dir=/usr/local/opt/libxslt
bundle install
Alberto
fuente