Użytkownik Maca i otrzymywanie OSTRZEŻENIE: Nokogiri zostało zbudowane przeciwko LibXML w wersji 2.7.8, ale ma dynamicznie ładowane 2.7.3

82

Przeprowadziłem różne badania i próbowałem wielu różnych rzeczy. Wiem, że na to pytanie odpowiadano wiele razy, ale żadne z sugerowanych rozwiązań nie działa.

Po uaktualnieniu do Lion otrzymuję błędy segmentacji w Rubim. Jestem prawie pewien, że to Nokogiri. Więc zainstalowałem libxml2 przez Homebrew. Pobiegłem brew link libxml2. Następnie ponownie zainstalowałem Nokogiri przy użyciu tej wersji biblioteki.

Na dowód:

$ 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

Umieściłem już Nokogiri na początku mojego pliku gemfile i wymagałem tego również w moim pliku środowiska. Nie mam pojęcia, dlaczego wciąż otrzymuję to ostrzeżenie.

Jakieś sugestie lub pomysły, aby upewnić się, że ładuje właściwą wersję libxml2?

Logika binarna
źródło
9
Nokogiri 1.6 i nowsze zawierają teraz libxml2 z gemem, więc możesz naprawić ten błąd, po prostu usuwając libxml2 z Homebrew. brew remove --force libxml2 bundle config --delete build.nokogiri gem uninstall nokogiri libxml-ruby bundle
Nate Berkopec
@NateBerkopec. Twoje rozwiązanie zadziałało dla mnie, podczas gdy zaakceptowana odpowiedź nie.
egyamado
1.6.2.1i Ubuntu 12.04nie graj miło. Wracam do 1.6.1naprawy po wypróbowaniu każdej innej poprawki, jaką udało mi się znaleźć.
Damien Roche

Odpowiedzi:

39

Właśnie spędziłem większą część poranka, pracując nad tym ostrzeżeniem. Ta poprawka jest przeznaczona dla osób korzystających z systemu Mac OS Lion. Poprawka powyżej przy użyciu

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

jest dla systemu Snow Leopard z biblioteką libxml2 zainstalowaną przez MacPorts.

W przypadku Lion, libxml2 jest ładowane jako część procesu ładowania początkowego. Niezależnie od tego, na którą bibliotekę libxml2 Nokogiri wskazuje, domyślna biblioteka systemu Lion dla libxml2 będzie używana w czasie wykonywania. Lion używa biblioteki libxml2.2.7.3 znajdującej się w /usr(nie /usr/local).

Jak wspomniano w wielu innych miejscach, można po prostu zignorować ostrzeżenie. Jeśli tak jak ja ostrzeżenie doprowadza Cię do szaleństwa, możesz to zrobić:

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

Co ciekawe, jeśli wpiszesz nokogiri -vw wierszu poleceń, otrzymasz odwrotne ostrzeżenie:

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

Sugeruje to, że ładowanie libxml2 wiąże się nie tylko z tym, że Ruby i Rails używają załadowanej przez system biblioteki libxml2, a linia poleceń używa libxml2 ze ścieżki środowiska. W każdym razie to ucisza błąd.

Powtórzę - to tylko dla Lwa. Poprzednia poprawka będzie działać w systemie Snow Leopard.

To już koniec odpowiedzi. Przestań czytać tutaj.


OK, nie przestawałeś czytać ... cóż ...

NIEPOLECANE!!!!!!

Zostałeś ostrzeżony. Możesz sprawdzić, czy Mac OSX ładuje bibliotekę libxml2 w swoim bootstrapie, wyłączając libxml2 znajdujący się w /usr/lib. Czy coś takiego kopiując wszystkie wersje libxml2*.dylibdo libxml2*.dylib.old(na moim komputerze to było libxml2.2.7.3, libxml2.2i libxml2).

Po wykonaniu tej czynności uruchomienie Nokogiri nie spowoduje żadnych błędów. Dzieje się tak, ponieważ nie może znaleźć załadowanego libxml2 i będzie teraz podążać ścieżką środowiska, ostatecznie znajdując libxml2.2.7.8w /opt/local.

ALE nie będziesz w stanie skopiować starych plików libxml z powrotem. Dzieje się tak, ponieważ system operacyjny potrzebuje biblioteki libxml2, która została załadowana w bootstrapie.

Wyłączenie i ponowne włączenie spowoduje uszkodzenie maszyny. Ekran logowania zawiesza się, zawiesza i zawiesza. Wyłącz i włącz ponownie w trybie pojedynczego użytkownika (przytrzymaj Command- Spodczas ponownego uruchamiania). Możesz obserwować, jak następuje bootstrap. Niska i oto zgłasza błąd, że nie może załadować libxml2, a następnie przestaje działać.

Wyłącz i włącz ponownie. Ten czas uruchamiania w trybie awaryjnym (albo zawieszone Command- Rlub zawieszone Option, a następnie wybierz dysk odzyskiwania). W trybie odzyskiwania otwórz terminal ( utilities/terminal). Zamontuj /usr/libna dysku HD (spróbuj /Volumes/Macintosh\ HD/usr/lib) i skopiuj z powrotem pliki libxml2. Uruchom ponownie i wszystko będzie dobrze.

Kenton
źródło
1
heh ... twoje instrukcje dotyczące podziału opcji kompilacji między / usr i / opt / local (MacPorts) zrobiły to za mnie ... dzięki
Phillip Koebbe,
Cieszę się, że ktoś mądrzejszy ode mnie również wpadł w konflikt z koszmarem Apple Bootstrap libxml2 :)
Kenton
Po prostu przypadkowo natknąłem się na ten post i nie miałem z niego pożytku, ale ta szczegółowa odpowiedź zasługuje na wiele głosów za wysiłek!
starscream_disco_party
2
Użyłem wariacji tego rozwiązania (gdzie moja dynamicznie ładowana wersja to 2.9.0):bundle config build.nokogiri --with-xml2-include=/usr/local/Cellar/libxml2/2.9.0/include/libxml2/
sberkley
Dzięki @sberkley za zaktualizowaną wskazówkę. Zauważyłem, kiedy go uruchomiłem, że jeśli to zrobisz ~, wydaje się, że ustawia tę wartość globalnie. Więc może możesz to zrobić tylko raz i nigdy więcej nie będziesz musiał się tym martwić.
duma
97

Jeśli zainstalowałeś Nokogiri z gem install nokogiri, możesz rozwiązać to ostrzeżenie, uruchamiając gem pristine nokogirirekompilację rozszerzenia C klejnotu.

Jeśli zainstalowałeś Nokogiri z bundle install, możesz rozwiązać to ostrzeżenie, uruchamiając bundle exec gem pristine nokogirirekompilację rozszerzenia C klejnotu wszędzie tam, gdzie zainstalował go Bundler.

pośredni
źródło
5
Wspaniale, dziękuję. bundle exec gem pristine nokogiriprzybił to.
toxaq
1
Działało idealnie dla mnie z ostrzeżeniem o kompilacji w porównaniu z 2.8.0 przez dynamiczne ładowanie 2.7.8 na Ubuntu 12.04
richard
aby otrzymać ostrzeżenie, aby odjechać na Lion and Rails 3.2.16, musiałem wykonać zarówno „bundle exec gem pristine nokogiri”, jak i przesunąć „gem nokogiri” przed „gem rails”
jpw
1
To działało dla mnie w OS X Mavericks, zaakceptowana odpowiedź nie.
CBanga
To powinna być akceptowana odpowiedź, a nie coś, co mogłoby potencjalnie zepsuć twoją maszynę, nie mówiąc już o tym, że jest wyjątkowo rozwlekłe i zagmatwane.
Greg Blass
58

Do tego jeśli używasz homebrew i Bundler naprawić, dodać gem 'nokogiri' do góry waszego Gemfile, a następnie uruchomić następujące polecenia:

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

Jeśli nie używasz pakietu, uruchom zamiast tego następujące polecenia:

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/

W swojej aplikacji powinieneś najpierw wymagać nokogiri , aby zmusić aplikację do załadowania biblioteki dynamicznej libxml2 zamiast starszej wersji systemowej libxml2 załadowanej przez gems, która nie określiła, którą bibliotekę załadować.

Michiel de Mare
źródło
Myślę, że polecenia linki nie unlinksą potrzebne. Udało mi się uciec bez ich używania.
M. Scott Ford,
zwróć uwagę, że może być konieczne dodanie gempoleceń przed bundle exec- na przykład, jeśli używasz rbenv.
asymetryczny
4
Czy jest jakiś powód, dla którego go nie uwzględniasz brew uninstall libxslt?
Nate Berkopec,
5
Dla tych, którzy kopiują i wklejają tę odpowiedź, najnowsza wersja libxml2 to 2.9.0 - pamiętaj, aby edytować to podczas kopiowania wklejania!
Nate Berkopec
7
Należy podkreślić, że ostatnie zdanie jest ważne: najpierw wymagaj nokogiri Zrób to, umieszczając nokogiri w swoim Gemfile przed szynami.
Wolfram Arnold
28

Nic z tego nie działało dla mnie.

Zainstalowałem libxml2 w późniejszej wersji (2.7.8) z brew. To spowodowało, że nokogiri kompilowało się przeciwko niemu i późniejszym problemom. Rozwiązanie, usuń je, następnie zbuduj, a następnie zainstaluj, jeśli chcesz.

Oto, co zadziałało:

  • brew uninstall libxml2 (jeśli wcześniej zainstalowano)
  • gem uninstall nokogiri
  • gem install nokogiri
  • brew install libxml2 (opcjonalny)
nkadwa
źródło
3
Naprawiło to dla mnie w systemie OS X 10.8.2 z biblioteką libxml 2.7.8 / 2.8.0. Samo usunięcie klejnotu nokogiri i ponowna instalacja go nie rozwiązało, ale brew uninstall libxml2wcześniej tak było. dzięki!
stereoscott
1
doskonała odpowiedź, jeśli używasz homebrew
awenkhh
+1 Perfect. Kluczem jest, aby NIE instalować żadnej innej wersji libxml2 podczas instalacji nokogiri.
Nate Cook
Poza tym, na wypadek, gdyby ktoś inny był RubyMine, pomogłem mi naprawić błąd, który otrzymywałem bundle installw RubyMine. Możesz zobaczyć ten sam błąd w wierszu poleceń, jeśli wpiszeszrake --tasks
Nate Cook
To było dla mnie właściwe rozwiązanie. Używam Mountain Lion i używam homebrew (i Intellij IDEA).
duma
16

Rozwiązanie (dla mnie) po aktualizacji do Mountain Lion było znacznie prostsze:

gem uninstall nokogiri
# (and ignore the warnings about dependencies)
gem install nokogiri
IAmNaN
źródło
4
Dzięki za opinię, Old Pro. Zachęcam do ponownego przeczytania pytań i odpowiedzi dotyczących przywilejów SO. „Używaj swoich głosów przeciw, ilekroć napotkasz rażąco niechlujny, niewymuszony wysiłek post lub odpowiedź, która jest wyraźnie i być może niebezpiecznie nieprawidłowa”. Ta odpowiedź najwyraźniej zadziałała dla kilku osób, w tym dla PO, więc nie sądzę, aby uzasadniała negatywny głos.
IAmNaN
1
Ze względu na niedawno odkrytą lukę w zabezpieczeniach DOS w zakresie zużycia procesora ( vuxml.org/freebsd/843a4641-9816-11e2-9c51-080027019be0.html ) zaktualizowaliśmy libxml2 na FreeBSD, powodując ostrzeżenie nokogiri . Ponowna instalacja zgodnie z opisem rozwiązała problem.
user569825
Pracował dla mnie na OSX 10.8.5
steakchaser
1
Nie, @Tass. update po prostu sprawdza, czy jest nowa wersja klejnotu, której w tym przypadku nie ma. Minęło ponad dwa lata, ale wydaje mi się, że bez uruchamiania dezinstalacji aktualizacja była NOP. Podejrzewam, że wersja nokogiri się nie zmienia, ale biblioteki muszą zostać skompilowane z różnymi nagłówkami po aktualizacji systemu operacyjnego, ta metoda, nawiasem mówiąc, zadziałała teraz po kilku aktualizacjach OSX.
IAmNaN
9

Zgodnie z komentarzem patrickmcgraw powyżej, po prostu umieszczenie nokogiri jako pierwszego wpisu w moim pliku Gemfile zadziałało dla mnie. Umieszczam to jako osobną odpowiedź, ponieważ oryginalny komentarz został ukryty.

source 'http://rubygems.org'
gem 'nokogiri'
gem 'rails', '3.0.20'
etc...
Shaun
źródło
1
Aby uzyskać wyjaśnienie, dlaczego to działa, zobacz odpowiedź @Jarrett
Jared Beck
Tak! Pomaga mi z „OSTRZEŻENIE: Nokogiri zostało zbudowane przeciwko LibXML w wersji 2.8.0, ale zostało dynamicznie załadowane 2.7.8”
Artem Aminov
4

Program Bundler ma opcje ustawienia domyślnych lokalizacji kompilacji. Na przykład z libxml2 zainstalowanym przez macports:

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

Po wykonaniu tej czynności bundle installostrzeżenie zniknęło.

Jest też kilka pomocnych przykładów ustawiania opcji budowania na wiki nokogiri .

foz
źródło
4

Wygląda na to, że po zainstalowaniu klejnotu zaktualizowałeś swoje biblioteki systemowe, więc musisz zaktualizować Nokogiri. Aby użyć aktualnej wersji lib:

 gem install nokogiri -- --use-system-libraries
Raittes
źródło
2

Miałem podobny problem i właśnie rozwiązałem w ten sposób:

W moim przypadku mam zainstalowany RVM i miałem zestawy klejnotów @global i @project. Obaj mieli zainstalowanego nokogiri, a jeden z nich zbudował z innym libxml.

Odbudowanie ich obu (mam powody, by to zrobić) rozwiązało problem.

Mam nadzieję że to pomoże..

shigeya
źródło
1
gem uninstall nokogiri
bundle  #install nokogiri again

Jeśli to się nie powiedzie, pojawi się komunikat „Brak libxml2”. i widzisz gems / nokogiri-1.5.0 / ext / nokogiri / mkmf.log próbujące użyć "/usr/bin/gcc-4.2 ...", to brakuje /usr/bin/gcc-4.2

Rozwiązanie:

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

Przed:

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

Po:

$ 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

Jeśli naprawdę brakuje Ci libxml2 libxslt, to

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: Prowadzę Mountain Lion z naparem i bundlerem.

konyak
źródło
1

gem install libxml-ruby pomaga mi

bmalets
źródło
0

Właściwie miałem zainstalowane 2 wersje libxml, jedną ze źródła, jedną z RPM.

Oto moje kompletne rozwiązanie

Odinstalowałem źródło (z katalogu źródłowego)

sudo make uninstall

Usuń pakiety

rm -rf ~/.bundle ~/.bundler

Zaktualizowany LD (może być konieczne zrobienie tego jako root, nie sudo)

sudo ldconfig

Następnie ponownie zainstalowałem pakiet

bundle install
jessebs
źródło
0

Właśnie wpadłem na to sam (OS X Lion 10.7.5). Moja dokładna wiadomość brzmiała: Nokogiri zostało zbudowane w oparciu o LibXML w wersji 2.8.0, ale ma dynamicznie załadowane 2.7.3

Wypróbowałem kilka wymienionych tutaj sugestii, żadna nie działała, ale to zadziałało:

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

Wyjaśnienie jest następujące: „Dzieje się tak, ponieważ używana jest domyślna libxml2 systemu Lion (ładowana podczas ładowania początkowego), niezależnie od tego, dla którego libxml2 Nokogiri zostało zbudowane”

Kredyty na: https://coderwall.com/p/o5ewia

Arta
źródło
0

System operacyjny: Maverick 10.9.3

Ruby 1.9.3

OSTRZEŻENIE: Nokogiri zostało zbudowane w oparciu o LibXML w wersji 2.9.1, ale ma dynamiczne ładowanie 2.9.0

Moje rozwiązanie:

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"

Mam nadzieję, że to pomoże

Phan Trung Kien
źródło
0

Jeśli masz tę wiadomość, a Twoje nokogiri jest nieaktualne w stosunku do wersji dostępnej ze źródła gem, po prostu uruchom, bundle update nokogiriaby pobrać nowy kod i ponownie skompilować. Twój błąd powinien zniknąć.

Martin Streicher
źródło
0

System operacyjny: Catalina

Ostrzeżenie: ostrzeżenie nokogiri zostało zbudowane przeciwko libxml w wersji 2.9.10, ale zostało dynamicznie załadowane 2.9.4

Śledziłem Michiel de Mare kroki , ale napar zainstalować libxml2 --with-xml2-config nie powiodło się z nieprawidłowym błędu opcji. Więc zainstalowałem libxml2 i libxslt i zanotowałem dane wyjściowe obu poleceń.

 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

I użyłem tych katalogów podczas konfigurowania pakietu dla 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

Podsumowując, wykonałem te kroki

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
źródło