概要
マストドンのアップデートで bundle install
は通るんだけど、
db:migrate
とかだけ失敗するという怪現象が起きたのでその検証。
環境
- OS : CentOS7
- Ruby : 2.6.5
- Cld : 3.2.4
- ProtocolBuffer : 3.11.2
こんなエラーが出た時
LoadError: Could not open library '/home/mastodon/live/vendor/bundle/ruby/2.6.0/gems/
cld3-3.2.4/lib/../ext/cld3/libcld3.so': /home/mastodon/live/vendor/bundle/ruby/2.6.0/
gems/cld3-3.2.4/lib/../ext/cld3/libcld3.so: undefined symbol: _ZNK6google8protobuf11M
essageLite25InitializationErrorStringB5cxx11Ev
結論から先に書いておくと、 yum
で入っている ProtocolBuffer
のライブラリと自分でソースからコンパイルした ProtocolBuffer
などライブラリの複数が共存していると発生。
インストール時と実行時でライブラリが異なってしまうとアウト。
このエラーのミソは「 B5cxx11Ev
」という部分だった。
これはRHEL系OS上のコンパイラでコンパイルされたsoファイル(yumで持ってきたもの)の中身に付く識別子らしい。
参考
- https://github.com/linkinpark213/linkinpark213.github.io/issues/12#issuecomment-455960955
- https://linkinpark213.com/2018/11/18/densepose-minesweeping/#2-10-Undefined-symbol-ZN6caffe219CPUOperatorRegistryB5cxx11Ev
対応
バージョンが古い方(おそらくはyumの方)を消してしまおう。
yumで入れた方を消す場合
sudo yum -y remove protobuf
ビルドした方を消す場合
ビルドしたディレクトリ( /usr/local/src/proto-buffer.hoge/build/
)で
sudo make uninstall clean
また、 cld3
は下記で一度アンインストールして、改めて bundle install
しなおそう。
RAILS_ENV=production bundle exec gem uninstall cld3
参考資料
- https://github.com/tootsuite/documentation/blob/master/Running-Mastodon/Updating-Mastodon-Guide.md
- https://github.com/protocolbuffers/protobuf
- https://github.com/linkinpark213/linkinpark213.github.io/issues/12#issuecomment-455960955
- https://linkinpark213.com/2018/11/18/densepose-minesweeping/#2-10-Undefined-symbol-ZN6caffe219CPUOperatorRegistryB5cxx11Ev