MAGAZINE

ルーターマガジン

開発環境

【M1 mac】bundle install で mysql2がインストールできないときの対処法

2022.03.03
Pocket

はじめに

こんにちは!学生アルバイトの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できないときの対処法

  1. ライブラリがインストールされているか確認
  2. → されていなければまずインストール
  3. パスを確認:
    $ brew --prefix <ライブラリ名>
  4. パスを再設定:
    $ bundle config --local build.mysql2 "--with-ldflags=-L#{$ brew --prefix openssl}/lib --with-opt-dir=#{$ brew --prefix <ライブラリ名>}"

これで解決できました!

参考

【Ruby】M1macでmysql2がインストールできないとき
Pocket

CONTACT

お問い合わせ・ご依頼はこちらから