charlock_holmes and icu4c LoadError

612 Views Asked by At

It can happen with macos that your Rails project using the charlock_holmes gem throws an error like this:

/Users/iwan/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/bootsnap-1.15.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require': dlopen(/Users/iwan/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/charlock_holmes-0.7.7/lib/charlock_holmes/charlock_holmes.bundle, 0x0009): Library not loaded: '/opt/homebrew/opt/icu4c/lib/libicudata.71.dylib' (LoadError)
  Referenced from: '/Users/iwan/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/charlock_holmes-0.7.7/lib/charlock_holmes/charlock_holmes.bundle'
  Reason: tried: '/opt/homebrew/opt/icu4c/lib/libicudata.71.dylib' (no such file), '/usr/local/lib/libicudata.71.dylib' (no such file), '/usr/lib/libicudata.71.dylib' (no such file), '/opt/homebrew/Cellar/icu4c/72.1/lib/libicudata.71.dylib' (no such file), '/usr/local/lib/libicudata.71.dylib' (no such file), '/usr/lib/libicudata.71.dylib' (no such file) - /Users/iwan/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/charlock_holmes-0.7.7/lib/charlock_holmes/charlock_holmes.bundle
  from /Users/iwan/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/bootsnap-1.15.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
  from /Users/iwan/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/charlock_holmes-0.7.7/lib/charlock_holmes.rb:1:in `<main>'
...
1

There are 1 best solutions below

0
On

This behavior can happen when brew is updated (and this happens when a new formula is installed: by default it does an overall update of all previously installed formulas), and in particular when icu4c is updated.

The charlock_holmes gem includes a C and C++ part that is compiled when you install the gem. Before compiling, however, a check is performed on the icu4c library installed, and its position is written in the Makefile document in which the steps to be performed in the compilation are defined.

At this point if icu4c has been updated for example from version 71 to 72.1, the compiled C code will no longer be able to access the old version of the library, which is no longer present. Hence the error.

The solution? Reinstall charlock_holmes:

gem install charlock_holmes