MAGAZINE
ルーターマガジン
【M1 mac】bundle install で mysql2がインストールできないときの対処法
はじめに
こんにちは!学生アルバイトのkaburagiです。
今回は、m1 macにmysql2 gemをインストールする際に生じたエラーとその対処について書きます。Rubyを使った開発では、gemに公開されている外部パッケージをインストールして使うことは避けて通れないため、大変お世話になるのですが、今回mysql2がインストールできずに困ったのでまとめていきます。
初めに結論
長くなりそうなので初めに結論をまとめておきます。mysql2 gemのインストールで
ld: warning: directory not found for option '-L/usr/local/opt/openssl/lib'
ld: library not found for -lzstd
のエラーが生じた場合、各ライブラリを指定するパスが誤っている可能性が高いです。したがって、
# homebrew経由でライブラリをインストールした場合、
$ brew --prefix openssl
$ brew --prefix zstd
# homebrew以外でライブラリをインストールした場合
$ which openssl
$ which zstd
をそれぞれ実行して、各ライブラリのパスを確認してから、
bundle config --local build.mysql2 "--with-ldflags=-L#{$ brew --prefix openssl}/lib --with-opt-dir=#{$ brew --prefix zstd}"
こちらのコマンドを実行します。このとき先ほど確認したパスを、対応するところに入れてください。そうすればbundle installできると思います。
環境
- MacBook Pro(2021)
- チップ:Apple M1 Pro
- Ruby:2.6.5p114 (2019-10-01 revision 67812) [-darwin21]
- Bundler:version 2.3.5
- rbenv:1.2.0 (brew経由でインストール)
やりたいこと
gemファイルをインストールする時にBundlerという管理パッケージを使うことができます。bundle installを使えば、Gemfileに記述してあるgemを一括でインストールできるため、パッケージの管理がしやすいという利点があります。さらには、gemの相互依存関係も管理してくれるため、Gemfileに記載してあるgemに関連するパッケージも必要に応じてインストールしてくれます。
今回は、このbundlerを使って、以下のGemfileをインストールしようとしたところ、
# Gemfileの内容
gem "nokogiri"
gem "activerecord"
gem "mysql2"
gem "aws-sdk"
gem "mechanize"
gem "chrome_remote"
gem "pry"
gem "aws-sdk-s3"
gem "selenium-webdriver"
gem "socksify"
gem 'retryable'
gem 'open_uri_redirections'
gem 'chrome_remote'
gem 'slack-notifier'
mysql2のインストールでエラーが生じてインストールできませんでした。
# エラー抜粋
...
-------------------------------------------------------------------------------------
linking shared-object mysql2/mysql2.bundle
ld: warning: directory not found for option '-L/usr/local/opt/openssl/lib'
ld: library not found for -lzstd
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1
make failed, exit code 2
--------------------------------------------------------------------------------------
...
これらのエラーを一つずつ見ていきます。
ld: warning: directory not found for option '-L/usr/local/opt/openssl/lib'
まず一つ目。どうやらopensslのディレクトリが見当たらないことでエラーになっているようです。まずはlsコマンドでディレクトリが本当に存在しないか確認します。
$ ls usr/local/opt/openssl/lib
ls: usr/local/opt/openssl/lib: No such file or directory
ないらしい、、ですがopensslのパスが間違っていることは確認できたので、パスを設定し直せば改善しそうです。
そもそもopensslがインストールされているか次のコマンドで確認します。
$ brew list | grep openssl
openssl@1.1
opensslは問題なくインストールされていました。
次にopensslの本当のパスを確認します、パスの確認は次のコマンドで行えます。
$ brew --prefix openssl
/opt/homebrew/opt/openssl@3
自分の場合は上記のパスが得られました。自分の場合は、homebrew経由でライブラリをインストールしていたので上記コマンドを使いましたが、homebrew以外でライブラリをインストールしている場合、上記コマンドではパスの検索ができません。その場合は次のコマンドを使うことができます。
$ which --prefix openssl
最後にmysql2のbuildオプション設定を、今取得したopensslのパスに変更します。パス変更のコマンドは次の通り。
bundle config --local build.mysql2 "--with-ldflags=-L#{$ brew --prefix openssl}/lib"
つまり今回は
bundle config --local build.mysql2 --with-ldflags=-L/opt/homebrew/opt/openssl@3/lib
これを実行すればOK!この時点でbundle installしてみると、
-------------------------------------------------------------------------------------
linking shared-object mysql2/mysql2.bundle
ld: library not found for -lzstd
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1
make failed, exit code 2
--------------------------------------------------------------------------------------
ld: warning: directory not found for option '-L/usr/local/opt/openssl/lib'が消えてました。後は、ld: library not found for -lzstdを解決できれば良さそうです。
ld: library not found for -lzstd
次にこちらを見ていきます。どうやらライブラリが見当たらないみたい。ちなみに-lはオプションコマンドらしいので、ライブラリ名はzstdです。
まずzstdがインストールされているか確認します。
$ bundle list | grep zstd
zstd
インストールはされてました。ということは、先ほどと同じくパスが間違っている可能性が高いです。opensslと同様のコマンドでパスを確認します。
# homebrew経由でライブラリをインストールした場合
$ brew --prefix zstd
/opt/homebrew/opt/zstd
# homebrew以外でライブラリをインストールした場合
$ which zstd
自分の場合はこのように表示されました。zstdが置いてあるパスを、mysql2のbuildオプション設定に追加します。コマンドは次の通り。
$ bundle config --local build.mysql2 "--with-opt-dir=#{$ brew --prefix zstd}"
先ほど確認したパスを入れて、
$ bundle config --local build.mysql2 --with-opt-dir=/opt/homebrew/opt/zstd
これを実行すればOK!
再度インストールしてみると、
$ bundle install
# 略
#
#
#
Bundle complete! 14 Gemfile dependencies, 266 gems now installed.
Bundled gems are installed into `./.bundle`
無事インストールできました!
まとめ
m1 macでmysql2がbundle installできないときの対処法
- ライブラリがインストールされているか確認 → されていなければまずインストール
- パスを確認:
$ brew --prefix <ライブラリ名>
- パスを再設定:
$ bundle config --local build.mysql2 "--with-ldflags=-L#{$ brew --prefix openssl}/lib --with-opt-dir=#{$ brew --prefix <ライブラリ名>}"
これで解決できました!
参考
【Ruby】M1macでmysql2がインストールできないときCONTACT
お問い合わせ・ご依頼はこちらから