[Rails][Gem] mini_racer_extension.so: undefined symbol: _ZTTNSt7* 解決法


起こったこと

Vagrant CentOS7 環境に Rails プロジェクトに gem react_on_rails を導入して
React を動かそうとしたところ rails generate react_on_rails:install

追加されていた依存する gem mini_racer
が以下のエラーを出してRails 起動しなくなった。

/home/vagrant/dev/rails-proj/vendor/bundle/ruby/2.6.0/gems/bootsnap-1.4.7/lib/bootsnap/load_path_cache/core_ext/
kernel_require.rb:23:in `require': 
/home/vagrant/dev/rails-proj/vendor/bundle/ruby/2.6.0/gems/mini_racer-0.3.1/lib/
mini_racer_extension.so: 
undefined symbol: _ZTTNSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESaIcEEE - /home/vagrant/dev/rails-proj/vendor/bundle/ruby/2.6.0/gems/mini_racer-0.3.1/lib/mini_racer_extension.so (LoadError)

原因

最近、gem mini_racer が version 0.3.x に上がったようで
不安定のよう。

解決法

とりあえず、gem mini_racer (最近0.3.xに上がったようなので) 、修正対応のある、最新のversion を取り入れる。

Gemfile
gem 'mini_racer', git: 'https://github.com/rubyjs/mini_racer', platforms: :ruby

該当部分

また、それでも直らない場合、参照している(この場合 ./vendor/bundle 配下) のmini_racer_extension.so をコンパイルしなおす。
一旦ファイル削除して、再度bundle install

$ sudo chmod 777 -R ./vendor/bundle # すべて削除する場合
$ rm -rf ./vendor/bundle
$ bundle install --path vendor/bundle

補足2

また、発生していたので、、追記。

$ rails 
rails aborted!
LoadError: /home/vagrant/dev/rails-proj/vendor/bundle/ruby/2.7.0/gems/mini_racer-0.3.1/lib/mini_racer_extension.so: undefined symbol: _ZTTNSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESaIcEEE - /home/vagrant/dev/rails-proj/vendor/bundle/ruby/2.7.0/gems/mini_racer-0.3.1/lib/mini_racer_extension.so
..

CentOS などOS のGCC が古いと使えない。
GCC version を上げて、
bundle install などでbuild native extension する。

$ gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39)  # <- 古い
..
# gcc upgrade
$ sudo yum install centos-release-scl 
$ sudo yum install devtoolset-9
$ scl enable devtoolset-9 bash
$ gcc --version
gcc (GCC) 9.3.1 20200408 (Red Hat 9.3.1-2)

その上で、

# ↑ のGemfile 修正版branch 指定
$ rm -rf ./vendor/bundle
$ bundle install --path vendor/bundle

補足

最初は gem mini_racerを 安定版の0.2.15 に戻したりしたが、
libv8 などで特定のGCC version 依存があるようで、
OSの GCC version調整がいるようで、
とりあえずこれで。

$ gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39)

参考