83

I have done all kinds of research and tried many different things. I know this question has been answered many times, but none of the suggested solutions are working for me.

After upgrading to Lion I am getting segmentation faults in Ruby. I'm fairly confident it's Nokogiri. So I installed libxml2 via Homebrew. I ran brew link libxml2. Then I reinstalled Nokogiri using that version of the library.

For proof:

$ 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

I've already included Nokogiri at the top of my gemfile and I've also required it in my environment file. I have no idea why I am still getting that warning.

Any suggestions or ideas to make sure it's loading the right version libxml2?

the Tin Man
  • 158,662
  • 42
  • 215
  • 303
Binary Logic
  • 1,529
  • 2
  • 17
  • 19
  • 9
    Nokogiri 1.6 and higher now bundles libxml2 with the gem, so you can fix this error by just removing libxml2 from Homebrew. `brew remove --force libxml2` `bundle config --delete build.nokogiri` `gem uninstall nokogiri libxml-ruby` `bundle` – Nate Berkopec Jun 11 '13 at 19:38
  • This is the answer: [http://stackoverflow.com/questions/16921700/how-to-load-correct-version-of-dynamic-libraries-and-gems-libxml-nokogiri-wit][1] [1]: http://stackoverflow.com/questions/16921700/how-to-load-correct-version-of-dynamic-libraries-and-gems-libxml-nokogiri-wit – Mario Uher Oct 24 '13 at 11:59
  • @NateBerkopec. Your solution worked for me while the accepted answer didn't. – egyamado Apr 12 '14 at 04:49
  • `1.6.2.1` and `Ubuntu 12.04` don't play nice. Dropping back to `1.6.1` fixed it after trying every other fix I could find. – Damien Roche May 18 '14 at 03:38

16 Answers16

99

If you installed Nokogiri with gem install nokogiri, you can resolve this warning by running gem pristine nokogiri to recompile the gem's C extension.

If you installed Nokogiri with bundle install, you can resolve this warning by running bundle exec gem pristine nokogiri to recompile the C extension of the gem wherever Bundler installed it.

indirect
  • 3,470
  • 2
  • 25
  • 13
  • 5
    Excellent, thank you. `bundle exec gem pristine nokogiri` nailed it. – toxaq May 16 '13 at 08:19
  • 1
    Worked perfectly for me with warning about being built against 2.8.0 by dynamically loading 2.7.8 on Ubuntu 12.04 – richard Aug 02 '13 at 06:50
  • to get the warning to go away on Lion and rails 3.2.16, I had to do both 'bundle exec gem pristine nokogiri' and also move 'gem nokogiri' ahead of 'gem rails' – jpw Dec 14 '13 at 22:04
  • 1
    This worked for me in OS X Mavericks, accepted answer did not. – CBanga Mar 17 '14 at 16:07
  • This should be the accepted answer, not something that could potentially brick your machine, let alone being extremely verbose and confusing. – Greg Blass Dec 16 '16 at 15:56
58

To fix this if you're using homebrew and bundler, add gem 'nokogiri' to the top of your Gemfile, then run these commands:

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

If you don't use bundler, run these commands instead:

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/

In your app, you should require nokogiri first, to force the app to load the dynamic libxml2 library instead of the older system version of libxml2 loaded by gems that failed to specify which library to load.

Michiel de Mare
  • 41,982
  • 29
  • 103
  • 134
  • I don't think the `link` and `unlink` commands are needed. I was able get away without using them. – M. Scott Ford Jul 10 '12 at 19:59
  • note that you might have to prepend the `gem` commands with `bundle exec` - for example if you're using `rbenv`. – asymmetric Sep 20 '12 at 11:31
  • 4
    Is there any reason you aren't including `brew uninstall libxslt`? – Nate Berkopec Oct 11 '12 at 20:04
  • I might also add that I had to delete my vendor/bundle folder where I had nokogiri previously installed and rerun bundle install to make sure I got the fresh installation of nokogiri. – acoustic_north Nov 13 '12 at 11:45
  • I was able to make the warning go away just by moving `nokogiri` to the first gem in my `Gemfile` – patrickmcgraw Jan 21 '13 at 04:17
  • 5
    For those copy-pasting this answer, the lastest version of libxml2 is 2.9.0 - be sure to edit this when copy pasting! – Nate Berkopec Mar 11 '13 at 17:30
  • 7
    It bears highlighting that the last sentence is important: **require nokogiri first** Do this by putting nokogiri in your Gemfile ahead of rails. – Wolfram Arnold Jul 01 '13 at 23:51
  • If you don't do `brew link libxml2 libxslt --overwirte --force` you might end up compiling with a newer version, but loading with the one currently linked (which might the old one). – FernandoEscher Jul 08 '13 at 22:40
  • Another copy paste warning. If you run these commands exactly as copy-pasted you must change libxml2 2.9.0 to libxml2 2.9.1 like: `gem install nokogiri -- --with-xml2-include=/usr/local/Cellar/libxml2/2.8.1/include/libxml2 --with-xml2-lib=/usr/local/Cellar/libxml2/2.8.1/lib --with-xslt-dir=/usr/local/Cellar/libxslt/1.1.26/` – Austin Pray Jan 12 '14 at 17:14
  • Rather than hard-code the paths, you can query `brew`, e.g: `XML2_PREFIX=$(brew --prefix libxml2) bundle config build.nokogiri --with-xml2-include="${XML2_PREFIX}/include/libxml2" --with-xml2-lib="${XML2_PREFIX}/lib"`... – johnsyweb May 15 '14 at 06:26
  • $ gem uninstall nokogiri libxml-ruby You have requested to uninstall the gem: nokogiri-1.6.1 capybara-2.4.4 depends on nokogiri (>= 1.3.3) chromedriver-helper-1.0.0 depends on nokogiri (~> 1.6) ... sprockets-3.2.0 depends on nokogiri (~> 1.3, development) sprockets-3.1.0 depends on nokogiri (~> 1.3, development) sprockets-3.0.3 depends on nokogiri (~> 1.3, development) tilt-1.4.1 depends on nokogiri (>= 0, development) xpath-2.0.0 depends on nokogiri (~> 1.3) If you remove this gem, these dependencies will not be met. Continue with Uninstall? [yN] – Katarzyna Sep 15 '15 at 21:36
  • @Katarzyna It's ok to uninstall, since you're going to reinstall the dependencies right after uninstalling them. – Michiel de Mare Sep 16 '15 at 09:44
  • @Michiel de Mare, thank you but I found the other solution. However I want to make sure: I had to shorten the list of dependencies. There were e.g. capybara & other gems that I had installed before I installed nokogiri. Wouldn't they just break? – Katarzyna Sep 18 '15 at 02:33
  • Even "easier" using the config binaries deliviered with both libs: `gem install nokogiri -- --use-system-libraries --with-xml2-config=$(brew --prefix libxml2)/bin/xml2-config --with-xslt-config=$(brew --prefix libxslt)/bin/xslt-config` – danielMitD Aug 04 '17 at 08:16
39

I just spent the better part of the morning working through this warning. This fix is for people using Mac OS Lion. The fix above using

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

is for Snow Leopard with libxml2 installed via MacPorts.

With Lion, libxml2 is loaded as part of the bootstrap process. Regardless of which libxml2 Nokogiri is pointing to, the Lion system default library for libxml2 will be used at runtime. Lion uses libxml2.2.7.3 found in /usr (not /usr/local).

As mentioned many other places, one can just ignore the warning. If, like me, the warning drives you crazy, you can do this:

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

Interestingly, if you type nokogiri -v at the command line you will get the opposite warning:

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

This suggests there is more to how libxml2 is being loaded, with Ruby and Rails using the system loaded libxml2 and the command line using libxml2 from the environment path. Anyway, this silences the error for me.

I’ll say it again – this is only for Lion. The previous fix will work for Snow Leopard.

This is the end of the answer. Stop reading here.


OK, you didn’t stop reading... well...

NOT RECOMMENDED!!!!!!

You have been warned. You can verify that Mac OSX is loading the libxml2 library in its bootstrap by disabling libxml2 found in /usr/lib. Do something like copying all versions of libxml2*.dylib to libxml2*.dylib.old (on my machine this was libxml2.2.7.3, libxml2.2 and libxml2).

After you have done this, running Nokogiri will not produce any errors. That is because it can’t find the loaded libxml2 and will now follow the environment path, eventually finding libxml2.2.7.8 in /opt/local.

BUT you won’t be able to copy the old libxml files back. This is because the OS needs the libxml2 that was loaded in the bootstrap.

Powering off and powering on again will brick your machine. The login screen will hang and hang and hang. Power off and power on again in single-user mode (hold Command-S while rebooting). You can watch the bootstrap occur. Low and behold, it throws an error that it can’t load libxml2 and then stops working.

Power off and power on again. This time boot into recovery mode (either hold Command-R or hold Option and then select the recovery disk). In recovery mode open the terminal (utilities/terminal). Mount /usr/lib on your HD (try /Volumes/Macintosh\ HD/usr/lib) and copy the libxml2 files back. Reboot and all will be fine.

the Tin Man
  • 158,662
  • 42
  • 215
  • 303
Kenton
  • 664
  • 7
  • 9
  • 1
    heh...your instructions to split the build options between /usr and /opt/local (MacPorts) did it for me ... thanks – Phillip Koebbe Dec 13 '11 at 03:01
  • Glad to see someone smarter than me also fell afoul of the Apple Bootstrap libxml2 nightmare :) – Kenton Mar 19 '12 at 19:21
  • I just stumbled across this post randomly and had no use for it, but this detailed answer deserves many upvotes for the effort! – starscream_disco_party Aug 29 '12 at 14:39
  • 2
    I used a variation on this solution (where my dynamically loaded version was 2.9.0): `bundle config build.nokogiri --with-xml2-include=/usr/local/Cellar/libxml2/2.9.0/include/libxml2/` – sberkley Apr 02 '13 at 19:13
  • Thanks to @sberkley for the updated tip. I noticed, when I ran it, that if you do it at `~`, it seems to set this value globally. So perhaps you can just do this once and never have to worry about it again. – duma Apr 30 '13 at 14:20
  • If you are using `bundler`, make sure to look at @indirect's answer below. `bundle exec gem pristine nokogiri` is probably what you're after. – Matt Sanders May 31 '13 at 17:50
  • Thanks, that did it. For the sake of completeness: don't forget to reinstall the `nokogiri` gem after running the `bundle config ...` command above. – Philipp Jun 12 '13 at 00:23
28

None of this worked for me.

I had libxml2 installed at a later version (2.7.8) with brew. This caused nokogiri to compile against it and the later problems. Solution, remove it, then build, then install if desired.

Here's what worked:

  • brew uninstall libxml2 (if previously installed)
  • gem uninstall nokogiri
  • gem install nokogiri
  • brew install libxml2 (optional)
nkadwa
  • 839
  • 8
  • 16
  • 3
    This fixed it for me on OS X 10.8.2 with libxml 2.7.8 / 2.8.0. Just removing the nokogiri gem and reinstalling it did not solve it, but `brew uninstall libxml2` beforehand did. thanks! – stereoscott Feb 17 '13 at 23:02
  • 1
    perfect answer if using homebrew – awenkhh Apr 16 '13 at 21:16
  • +1 Perfect. The key is to NOT have any other version of libxml2 installed when you install nokogiri. – Nate Cook Jun 15 '13 at 15:40
  • Also, just in case anyone else is RubyMine, this is what I helped me fixed the error I was getting with `bundle install` from within RubyMine. You can see the same error in the command line if you type `rake --tasks` – Nate Cook Jun 15 '13 at 15:43
  • This was the correct solution for me. I'm running Mountain Lion and am using homebrew (and Intellij IDEA). – duma Jul 11 '13 at 15:02
  • I have tried brew uninstall libxml2 I got Error: No such keg: /usr/local/Cellar/libxml2 But brew install libxml2 libxslt worked for me on mac os x mavericks. – Canbey Bilgili Nov 01 '13 at 11:16
  • I actually just needed to run `xcode-select --install`: https://github.com/sparklemotion/nokogiri/issues/1445#issuecomment-216581445 Just need to follow the installation instructions for Nokogiri: http://www.nokogiri.org/tutorials/installing_nokogiri.html#mac_os_x – ndbroadbent Apr 12 '17 at 18:21
16

The solution (for me) after updating to Mountain Lion was much simplier:

gem uninstall nokogiri
# (and ignore the warnings about dependencies)
gem install nokogiri
Simon B.
  • 2,530
  • 24
  • 30
IAmNaN
  • 10,305
  • 3
  • 53
  • 51
  • 4
    Thanks for the feedback, Old Pro. I encourage you to consider re-reading the SO Privileges Q&A. "Use your downvotes whenever you encounter an egregiously sloppy, no-effort-expended post, or an answer that is clearly and perhaps dangerously incorrect." This answer clearly worked for several people including the OP so I don't think it warrants a downvote. – IAmNaN Mar 12 '13 at 21:39
  • 1
    Due to the recently discovered cpu consumption DOS vulnerability (http://www.vuxml.org/freebsd/843a4641-9816-11e2-9c51-080027019be0.html) we updated libxml2 on FreeBSD, causing the **nokogiri warning** in question. Reinstalling as described, solved the issue. – user569825 Apr 10 '13 at 18:18
  • Worked for me on OSX 10.8.5 – steakchaser Jan 17 '14 at 00:58
  • 1
    No, @Tass. update simply checks if there is a new version of the gem, which there isn't in this case. It's been a more than two years but I seem to remember without running uninstall, update was a NOP. I suspect the version of nokogiri doesn't change but the libs need to compiled with different headers after upgrading the OS.This method, by the way, has worked after several OSX updates now. – IAmNaN Aug 15 '14 at 18:06
9

As per the comment from patrickmcgraw above, simply putting nokogiri as the first entry in my Gemfile worked for me. I'm putting it as a separate answer because the original comment has been buried.

source 'http://rubygems.org'
gem 'nokogiri'
gem 'rails', '3.0.20'
etc...
Shaun
  • 141
  • 1
  • 4
  • 1
    For an explanation of *why* this works, see [this answer](http://stackoverflow.com/questions/4831714/nokogiri-was-built-against-libxml-version-2-7-7-but-has-dynamically-loaded-2-7?rq=1) by @Jarrett – Jared Beck Sep 28 '13 at 23:53
  • Yeah! Helps me with 'WARNING: Nokogiri was built against LibXML version 2.8.0, but has dynamically loaded 2.7.8' – Artem Aminov Nov 24 '13 at 07:53
4

Looks like you have updated your system libraries after installing the gem, so you have to update Nokogiri. To use the current lib version:

 gem install nokogiri -- --use-system-libraries
the Tin Man
  • 158,662
  • 42
  • 215
  • 303
raittes
  • 5,271
  • 3
  • 30
  • 27
4

Bundler has options to set the default build locations. So for instance, with libxml2 installed via macports:

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

After doing this and bundle install, the warning went away.

There's also some helpful examples for setting build options on the nokogiri wiki.

foz
  • 5,230
  • 2
  • 23
  • 15
2

I had similar problem and just solved this way:

In my case, I have RVM installed, and I had @global and @project gem sets. Both of them had nokogiri installed and one of them had built with with different libxml.

Rebuilding both of them (I have reason to do this) solved the problem.

Hope this helps..

shigeya
  • 4,862
  • 3
  • 32
  • 33
1
gem uninstall nokogiri
bundle  #install nokogiri again

If that fails with "libxml2 is missing." and you see gems/nokogiri-1.5.0/ext/nokogiri/mkmf.log trying to use "/usr/bin/gcc-4.2 ...", then you're missing /usr/bin/gcc-4.2

Solution:

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

Before:

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

After:

$ 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

If you're really missing libxml2 libxslt, then

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: I'm running Mountain Lion with brew, and bundler.

konyak
  • 10,818
  • 4
  • 59
  • 65
1

gem install libxml-ruby helps me

bmalets
  • 3,207
  • 7
  • 35
  • 64
0

I actually had 2 versions of libxml installed, one from source, one from an RPM.

The following is my complete solution

I uninstalled source (from the source directory)

sudo make uninstall

Remove bundles

rm -rf ~/.bundle ~/.bundler

Updated LD (might have to do this as root, not sudo)

sudo ldconfig

Then reinstalled the bundle

bundle install
jessebs
  • 517
  • 3
  • 14
0

Just ran into this myself (OS X Lion 10.7.5). My exact message was: Nokogiri was built against LibXML version 2.8.0, but has dynamically loaded 2.7.3

I tried a few suggestions mentioned here, none worked, but this did:

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

The explanation is: "This happens because the Lion system default libxml2 (loaded at bootstrap) is used, regardless of which libxml2 Nokogiri was built against."

Credits to: https://coderwall.com/p/o5ewia

Arta
  • 5,127
  • 5
  • 25
  • 23
0

OS : Maverick 10.9.3

Ruby 1.9.3

WARNING: Nokogiri was built against LibXML version 2.9.1, but has dynamically loaded 2.9.0

My solution:

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"

Hope this help

0

If you have this message and your nokogiri is out-of-date with the version available from the gem source, simply run bundle update nokogiri to get the new code and recompile. Your error should go away.

Martin Streicher
  • 1,983
  • 1
  • 18
  • 18
0

OS: Catalina

Warning: warning nokogiri was built against libxml version 2.9.10 but has dynamically loaded 2.9.4

I followed Michiel de Mare steps, but brew install libxml2 --with-xml2-config failed with invalid option error. So I installed libxml2 and libxslt and took note of the output from both commands.

 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

And I used those directories when configuring bundle for 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

To summarize I executed these steps

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
  • 43
  • 4