Пользователь Mac и получает ПРЕДУПРЕЖДЕНИЕ: Nokogiri был построен на основе LibXML версии 2.7.8, но динамически загружается 2.7.3.


82

Я провел всевозможные исследования и пробовал много разных вещей. Я знаю, что на этот вопрос много раз отвечали, но ни одно из предложенных решений у меня не работает.

После обновления до Lion я получаю ошибки сегментации в Ruby. Я почти уверен, что это Нокогири. Итак, я установил libxml2 через Homebrew. Я сбежал brew link libxml2. Затем я переустановил Nokogiri, используя эту версию библиотеки.

Для доказательства:

$ 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

Я уже включил Nokogiri в начало своего гем-файла, и мне также нужно, чтобы он был в моем файле среды. Понятия не имею, почему я все еще получаю это предупреждение.

Есть ли предложения или идеи, чтобы убедиться, что загружается правильная версия libxml2?


9
Nokogiri 1.6 и выше теперь связывает libxml2 с гемом, поэтому вы можете исправить эту ошибку, просто удалив libxml2 из Homebrew. brew remove --force libxml2 bundle config --delete build.nokogiri gem uninstall nokogiri libxml-ruby bundle
Nate Berkopec


@NateBerkopec. Ваше решение сработало для меня, а принятый ответ - нет.
egyamado

1.6.2.1и Ubuntu 12.04не играй хорошо. Отказываюсь от 1.6.1исправления после того, как попробовал все остальные исправления, которые смог найти.
Дэмиен Рош

Ответы:


39

Я просто потратил большую часть утра, работая над этим предупреждением. Это исправление предназначено для людей, использующих Mac OS Lion. Исправление выше с использованием

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

предназначен для Snow Leopard с libxml2, установленным через MacPorts.

В Lion libxml2 загружается как часть процесса начальной загрузки. Независимо от того, на что указывает libxml2 Nokogiri, во время выполнения будет использоваться системная библиотека Lion по умолчанию для libxml2. Lion использует libxml2.2.7.3 из /usr(не /usr/local).

Как уже упоминалось во многих других местах, предупреждение можно просто игнорировать. Если, как и я, предупреждение сводит вас с ума, вы можете сделать это:

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

Интересно, что если набрать nokogiri -v в командной строке, вы получите противоположное предупреждение:

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

Это говорит о том, что существует больше информации о том, как загружается libxml2: Ruby и Rails используют загруженную системой libxml2, а в командной строке - libxml2 из пути к среде. Во всяком случае, это заглушает ошибку для меня.

Повторюсь - это только для Lion. Предыдущее исправление будет работать для Snow Leopard.

Это конец ответа. Прекратите читать здесь.


Хорошо, ты не перестал читать ... ну ...

НЕ РЕКОМЕНДУЕТСЯ!!!!!!

Вы были предупреждены. Вы можете убедиться, что Mac OSX загружает библиотеку libxml2 в свой загрузочный файл, отключив libxml2, найденную в /usr/lib. Сделайте что-нибудь вроде копирования всех версий libxml2*.dylibв libxml2*.dylib.old(на моей машине это было libxml2.2.7.3, libxml2.2и libxml2).

После этого запуск Nokogiri не приведет к ошибкам. Это потому, что он не может найти загруженный libxml2 и теперь будет следовать по пути среды, в конечном итоге найдя libxml2.2.7.8в /opt/local.

НО вы не сможете скопировать старые файлы libxml обратно. Это связано с тем, что ОС требуется библиотека libxml2, которая была загружена при загрузке.

Выключение и повторное включение заблокируют вашу машину. Экран входа в систему будет зависать и зависать. Выключите и снова включите в однопользовательском режиме (удерживайте Command- Sпри перезагрузке). Вы можете наблюдать, как происходит начальная загрузка. Низкий и вот, он выдает ошибку, что не может загрузить libxml2, а затем перестает работать.

Выключите и снова включите. На этот раз загрузитесь в режиме восстановления (удерживайте Command- Rили удерживайте, Optionа затем выберите диск восстановления). В режиме восстановления откройте терминал ( utilities/terminal). Смонтируйте /usr/libна свой HD (попробуйте /Volumes/Macintosh\ HD/usr/lib) и скопируйте файлы libxml2 обратно. Перезагрузитесь, и все будет хорошо.


1
хех ... ваши инструкции по разделению параметров сборки между / usr и / opt / local (MacPorts) сделали это за меня ... спасибо
Филипп Кеббе

Рад видеть, что кто-то умнее меня также столкнулся с кошмаром Apple Bootstrap libxml2 :)
Кентон

Я случайно наткнулся на этот пост, и мне он не понадобился, но этот подробный ответ заслуживает множества положительных отзывов за свои усилия!
starscream_disco_party

2
Я использовал вариант этого решения (где моя динамически загружаемая версия была 2.9.0):bundle config build.nokogiri --with-xml2-include=/usr/local/Cellar/libxml2/2.9.0/include/libxml2/
sberkley 02

Спасибо @sberkley за обновленный совет. Когда я запускал его, я заметил, что если вы сделаете это в ~, похоже, это значение будет установлено глобально. Так что, возможно, вы сможете сделать это один раз и больше никогда не придется об этом беспокоиться.
Дума

97

Если вы установили Nokogiri с gem install nokogiri, вы можете устранить это предупреждение, запустив gem pristine nokogiriперекомпиляцию расширения C гемма.

Если вы установили Nokogiri с помощью bundle install, вы можете устранить это предупреждение, запустив bundle exec gem pristine nokogiriперекомпиляцию расширения C гемма, где бы Bundler его ни установил.


5
Отлично, спасибо. bundle exec gem pristine nokogiriУспешно справился.
toxaq

1
Отлично работал у меня с предупреждением о сборке против 2.8.0 путем динамической загрузки 2.7.8 на Ubuntu 12.04
Ричард

чтобы получить предупреждение об уходе на Lion и rails 3.2.16, мне пришлось выполнить как 'bundle exec gem pristine nokogiri', так и переместить 'gem nokogiri' перед 'gem rails'
jpw

1
Это сработало для меня в OS X Mavericks, принятый ответ - нет.
CBanga

Это должен быть принятый ответ, а не то, что потенциально может заблокировать вашу машину, не говоря уже о том, чтобы быть чрезвычайно многословным и запутанным.
Грег Бласс

58

Чтобы это исправить , если вы используете доморощенные и Bundler, добавить gem 'nokogiri' к вершине из ваших Gemfile, а затем выполните следующие команды:

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

Если вы не используете сборщик, запустите вместо этого следующие команды:

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/

В вашем приложении вы должны сначала потребовать nokogiri , чтобы приложение загружало динамическую библиотеку libxml2 вместо более старой системной версии libxml2, загруженной гемами, которые не могли указать, какую библиотеку загружать.


Я не думаю , что linkи unlinkнужны команды. Я смог обойтись без них.
М. Скотт Форд

обратите внимание, что вам может потребоваться добавить к gemкомандам bundle exec- например, если вы используете rbenv.
asymmetric

4
Есть ли причина, по которой вы не включаете brew uninstall libxslt?
Нейт Беркопек,

5
Для тех, кто копирует этот ответ, последняя версия libxml2 - 2.9.0 - обязательно отредактируйте это при копировании!
Нейт Беркопек,

7
Следует подчеркнуть важность последнего предложения: сначала требуется nokogiri. Сделайте это, поместив nokogiri в свой Gemfile перед рельсами.
Вольфрам Арнольд

28

У меня ничего из этого не сработало.

У меня был установлен libxml2 в более поздней версии (2.7.8) с brew. Это привело к компиляции nokogiri против него и последующих проблем. Решение, удалите его, затем создайте, затем установите, если хотите.

Вот что сработало:

  • brew uninstall libxml2 (если установлен ранее)
  • gem uninstall nokogiri
  • gem install nokogiri
  • brew install libxml2 (необязательный)

3
Это исправило это для меня в OS X 10.8.2 с libxml 2.7.8 / 2.8.0. Простое удаление гема nokogiri и его повторная установка не решило проблему, но brew uninstall libxml2заранее решила . благодаря!
Stereoscott

1
идеальный ответ при использовании домашнего пивоварения
awenkhh

+1 Отлично. Ключ в том, чтобы НЕ устанавливать никакую другую версию libxml2 при установке nokogiri.
Nate Cook

Кроме того, на всякий случай, если кто-то еще является RubyMine, это то, что я помог мне исправить ошибку, с которой я получал bundle installиз RubyMine. Вы можете увидеть ту же ошибку в командной строке, если наберетеrake --tasks
Nate Cook

Для меня это было правильным решением. Я использую Mountain Lion и использую homebrew (и Intellij IDEA).
duma

16

Решение (для меня) после обновления до Mountain Lion было намного проще:

gem uninstall nokogiri
# (and ignore the warnings about dependencies)
gem install nokogiri

4
Спасибо за отзыв, Old Pro. Я рекомендую вам перечитать вопросы и ответы о привилегиях SO. «Используйте свои отрицательные голоса всякий раз, когда вы сталкиваетесь с вопиюще небрежным, не требующим усилий постом или ответом, который является явно и, возможно, опасно неверным». Этот ответ явно сработал для нескольких человек, включая OP, поэтому я не думаю, что он заслуживает отрицательного голоса.
IAmNaN

1
Из-за недавно обнаруженной уязвимости DOS, потребляющей центральный процессор ( vuxml.org/freebsd/843a4641-9816-11e2-9c51-080027019be0.html ), мы обновили libxml2 во FreeBSD, в результате чего возникло соответствующее предупреждение nokogiri . Повторная установка, как описано, решила проблему.
user569825

Работал у меня на OSX 10.8.5
steakchaser

1
Нет, @Tass. update просто проверяет наличие новой версии драгоценного камня, которой в данном случае нет. Прошло более двух лет, но я, кажется, помню, что без запуска удаления обновление было NOP. Я подозреваю, что версия nokogiri не меняется, но библиотеки должны быть скомпилированы с разными заголовками после обновления ОС. Этот метод, кстати, сработал после нескольких обновлений OSX.
IAmNaN

9

В соответствии с комментарием от patrickmcgraw выше, у меня сработало просто поместить nokogiri в качестве первой записи в моем Gemfile. Я помещаю это как отдельный ответ, потому что исходный комментарий был похоронен.

source 'http://rubygems.org'
gem 'nokogiri'
gem 'rails', '3.0.20'
etc...

1
Объяснение того, почему это работает, можно найти в ответе @Jarrett
Джаред Бек

Да уж! Помогает мне с «ПРЕДУПРЕЖДЕНИЕ: Nokogiri был построен на основе LibXML версии 2.8.0, но динамически загружен 2.7.8»
Артем Аминов

4

Bundler имеет параметры для установки местоположений сборки по умолчанию. Так, например, при установке libxml2 через macports:

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

После этого и bundle install предупреждение исчезло.

Также есть несколько полезных примеров настройки параметров сборки в вики nokogiri .


4

Похоже, вы обновили свои системные библиотеки после установки гема, поэтому вам нужно обновить Nokogiri. Чтобы использовать текущую версию библиотеки:

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

2

У меня была аналогичная проблема, и я решил ее так:

В моем случае у меня установлен RVM, и у меня были наборы гемов @global и @project. У обоих из них был установлен nokogiri, а один из них был построен с другим libxml.

Восстановление их обоих (у меня есть причина для этого) решило проблему.

Надеюсь это поможет..


1
gem uninstall nokogiri
bundle  #install nokogiri again

Если это не удается с «libxml2 отсутствует». и вы видите, что gems / nokogiri-1.5.0 / ext / nokogiri / mkmf.log пытается использовать "/usr/bin/gcc-4.2 ...", значит, вам не хватает /usr/bin/gcc-4.2

Решение:

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

До:

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

После:

$ 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

Если вам действительно не хватает libxml2 libxslt, тогда

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

К вашему сведению: я использую Mountain Lion с пивом и упаковщиком.



0

На самом деле у меня было установлено 2 версии libxml, одна из исходников, другая из RPM.

Ниже приводится мое полное решение

Я удалил исходный код (из исходного каталога)

sudo make uninstall

Удалить пакеты

rm -rf ~/.bundle ~/.bundler

Обновлен LD (возможно, придется сделать это как root, а не sudo)

sudo ldconfig

Потом переустановил связку

bundle install

0

Просто столкнулся с этим сам (OS X Lion 10.7.5). Мое точное сообщение было: Nokogiri был построен на основе LibXML версии 2.8.0, но динамически загружен 2.7.3.

Я попробовал несколько предложений, упомянутых здесь, ни одно из них не сработало, но это сработало:

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

Объяснение таково: «Это происходит из-за того, что используется стандартная система Lion libxml2 (загружается при начальной загрузке), независимо от того, на какой libxml2 была создана Nokogiri».

Кредиты на: https://coderwall.com/p/o5ewia


0

ОС: Maverick 10.9.3

Рубин 1.9.3

ПРЕДУПРЕЖДЕНИЕ: Nokogiri был построен на основе LibXML версии 2.9.1, но динамически загружается 2.9.0.

Мое решение:

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"

Надеюсь на эту помощь


0

Если у вас есть это сообщение и ваш nokogiri устарел с версией, доступной из источника гема, просто запустите, bundle update nokogiriчтобы получить новый код и перекомпилировать. Ваша ошибка должна исчезнуть.


0

ОС: Каталина

Предупреждение: предупреждение nokogiri было построено против libxml версии 2.9.10, но динамически загружено 2.9.4

Я выполнил шаги Michiel de Mare , но brew install libxml2 --with-xml2-config завершился неудачно с ошибкой неверной опции. Итак, я установил libxml2 и libxslt и обратил внимание на вывод обеих команд.

 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

И я использовал эти каталоги при настройке пакета для 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

Подводя итог, я выполнил эти шаги

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.