概要
Rails + MySQLで開発環境を構築する際に発生しうるそこそこややこしいエラーについて、自分なりにまとめてみました。
※Railsの中で、mysql2というgemを使用してます。
発生したエラーについて
Railsのプロジェクトをrails new
コマンドで作成後、bundle installした際に下記のエラーが発生することがある。
...省略
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
...省略
linking shared-object mysql2/mysql2.bundle
ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1
make failed, exit code 2
Gem files will remain installed in /var/folders/mj/93db0vd975799gg9w3nnr3_r0000gn/T/bundler20190503-14531-xlyd6cmysql2-0.5.2/gems/mysql2-0.5.2 for inspection.
Results logged to /var/folders/mj/93db0vd975799gg9w3nnr3_r0000gn/T/bundler20190503-14531-xlyd6cmysql2-0.5.2/extensions/universal-darwin-18/2.3.0/mysql2-0.5.2/gem_make.out
An error occurred while installing mysql2 (0.5.2), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.2'` succeeds before bundling.
In Gemfile:
mysql2
このエラーメッセージで着目したいのは、この一行である。
ld: library not found for -lssl
これはどうやらopenssl
というライブラリに起因するエラーのようです。
(※厳密にはlibssl
だそうです、、、)
このlibsslは、どうやらGCC(GNU Compiler Collectionの略称)のopensslへのリンクオプションらしいです。(参照元)
いろんな記事にて、
$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib"
このコマンドを実行すると解決する!!!みたいなことがよく書かれていると思いますが、これは上記のopensslのライブラリの場所を--with-ldflags
というオプションに渡してあげるとopensslというライブラリ自体を参照するようにしてくれるみたいです。
ですが残念ながら、これでもまだ解決できないケースがあります。
MacのHigh Sierraから、デフォルトのOpenSSLがOpenSSLからLibreSSLになっているそうで、OpenSSLの諸々の問題を鑑みれば英断らしいのですが、そうはいっても開発環境の様々なツールがOpenSSLに依存しておりアレコレと新たな問題を引き起こすため、様々なツールのほうがLibreSSLに対応するまでさくっとOpenSSLに出戻る方法が下記です。
要するに、どうやらHigh Sierra以降はデフォルトがopensslになっていないそうです。
故に、冒頭にあったopensslというライブラリへの参照が見つからないみたいなエラーが発生してしまいます。
実際にOpenSSLのバージョンを覗いてみると、、、
$ openssl version
LibreSSL 3.0.0 7
このようにLibreSSLになってしまっているそうですね、、、、、
この問題の解決方法として、opensslでデフォルトのLibreSSLからOpenSSLに変更する必要があります。
このやり方に関してはシンプルにパスを通すだけで良いそうです。
$ echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.zsh_profile
ターミナルを再起動すると下記のように、OpenSSLに変更することができました。
$ openssl version
OpenSSL 3.0.0 7 sep 2021
ここまでできたらbundle installコマンドが正常に動作すると重います!!!
まとめ
MySQLのセッティング周りはわりかしややこしいところが多くて、脳死しながらエラー解決しがちになってしまいますが、そこは堪えてエラーメッセージを一つづつ丁寧に読んでみましょう。
なんだかんだ、それがエラー解決の近道だったりしますよね (自戒の意味も込めて)。