在 macOS Big Sur 11.4 Apple M1 上使用 bundle install 安装 mysql2 gem 时出现“ld: library not found for -lzstd”错误。

31
在执行bundle install时
An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling.

Rails应用程序6.1.3

Bundler版本2.2.19

macOS Big Sur 11.4

Apple M1芯片

Gemfile文件中

ruby '2.6.6'
gem 'rails', '~> 6.1.3', '>= 6.1.3.1'
gem 'mysql2'

在Gemfile.lock中,mysql版本为0.5.3。

当我运行 bundle install 命令时,它会出现崩溃并显示以下错误信息:

enter image description here

检查构建错误时,发现错误出现在输出的较早位置,完整结果如下:

 ld: library not found for -lzstd
< p > bundle install 的完整结果如下:

jason@MacBook-Air  % bundle install    
Fetching gem metadata from https://rubygems.org/
Fetching gem metadata from https://rubygems.org/........
Using rake 13.0.3
Using concurrent-ruby 1.1.8
Using rack 2.2.3
Using nio4r 2.5.7
Using builder 3.2.4
Using marcel 1.0.1
Using mini_portile2 2.5.1
Using multi_json 1.15.0
Using method_source 1.0.0
Using crass 1.0.6
Using thor 1.1.0
Using public_suffix 4.0.6
Using execjs 2.7.0
Using aws-eventstream 1.1.1
Using aws-partitions 1.447.0
Using jmespath 1.4.0
Using bcrypt 3.1.16
Using betterlorem 0.1.2
Using bindex 0.8.1
Using msgpack 1.4.2
Using popper_js 1.16.0
Using ffi 1.15.0
Using tilt 2.0.10
Using bundler 2.2.19
Using byebug 11.1.3
Using regexp_parser 2.1.1
Using childprocess 3.0.0
Using connection_pool 2.2.5
Using rexml 3.2.5
Using orm_adapter 0.5.0
Using diff-lcs 1.4.4
Using unf_ext 0.0.7.7
Using docile 1.3.5
Using e2mmap 0.1.0
Using erubis 2.7.0
Using ffaker 2.18.0
Using finishing_moves 1.0.1
Using raabro 1.4.0
Using temple 0.8.2
Using sexp_processor 4.15.2
Using hashdiff 1.0.1
Using hiredis 0.6.3
Using honeybadger 4.8.0
Using kaminari-core 1.2.1
Using rb-fsevent 0.10.4
Using ruby_dep 1.5.0
Using ruby2_keywords 0.0.4
Fetching mysql2 0.5.3
Using minitest 5.14.4
Using zeitwerk 2.4.2
Using parslet 1.8.2
Using puma 3.12.6
Using rails_http_options 0.1.0
Using redis 4.2.5
Using rubyzip 2.3.0
Using semantic_range 3.0.0
Using rspec-support 3.10.2
Using simple-random 1.0.3
Using simplecov-html 0.12.3
Using simplecov_json_formatter 0.1.2
Using spring 2.1.1
Using sqlite3 1.4.2
Using stripe 5.32.1
Using vcr 6.0.0
Using i18n 1.8.10
Using tzinfo 2.0.4
Using rack-test 1.1.0
Using sprockets 3.7.2
Using warden 1.2.9
Using rack-attack 6.5.0
Using rack-cors 1.1.1
Using rack-protection 2.1.0
Using rack-proxy 0.6.5
Using sitemap_generator 6.1.2
Using addressable 2.7.0
Using autoprefixer-rails 10.2.4.0
Using aws-sigv4 1.2.3
Using bootsnap 1.7.4
Using sassc 2.4.0
Using crack 0.4.5
Using unf 0.1.4
Using haml 5.2.1
Using ruby_parser 3.15.1
Using rb-inotify 0.10.1
Using mustermann 1.1.1
Using thwait 0.2.0
Using sidekiq 6.2.1
Using websocket-extensions 0.1.5
Using activesupport 6.1.3.2
Using aws-sdk-core 3.114.0
Using simpleidn 0.2.1
Using et-orbi 1.2.4
Using faker 2.17.0
Using sass-listen 4.0.0
Using launchy 2.5.0
Using listen 3.1.5
Using rspec-core 3.10.1
Using rspec-expectations 3.10.1
Using rspec-mocks 3.10.2
Using selenium-webdriver 3.142.7
Using simplecov 0.21.2
Using sinatra 2.1.0
Using webmock 3.12.2
Using erubi 1.10.0
Using mini_mime 1.0.3
Using racc 1.5.2
Using ruby_http_client 3.5.2
Using nokogiri 1.11.3
Using websocket-driver 0.7.3
Using globalid 0.4.2
Using activemodel 6.1.3.2
Using mail 2.7.1
Using aws-sdk-kms 1.43.0
Using dnsruby 1.61.5
Using factory_bot 6.1.0
Using fugit 1.4.5
Using sass 3.7.4
Using jbuilder 2.11.2
Using rspec 3.10.0
Using sendgrid-ruby 6.4.0
Using shoulda-matchers 4.5.1
Using simplecov-rcov 0.2.3
Using split 3.4.1
Using spring-watcher-listen 2.0.1
Using rails-dom-testing 2.0.3
Using loofah 2.9.1
Using activejob 6.1.3.2
Using activerecord 6.1.3.2
Using aws-sdk-s3 1.93.1
Using xpath 3.2.0
Using html2haml 2.2.0
Using roo 2.8.3
Using rspec-wait 0.0.9
Using rufus-scheduler 3.7.0
Using webdrivers 4.6.0
Using rails-html-sanitizer 1.3.0
Using sidekiq-scheduler 3.0.1
Using capybara 3.35.3
Using counter_culture 2.8.0
Using actionview 6.1.3.2
Using kaminari-activerecord 1.2.1
Using actionpack 6.1.3.2
Using kaminari-actionview 1.2.1
Using nonschema_migrations 5.0.2
Using actionmailer 6.1.3.2
Using railties 6.1.3.2
Using sprockets-rails 3.2.2
Using kaminari 1.2.1
Using activestorage 6.1.3.2
Using activerecord-session_store 2.0.0
Using font_awesome5_rails 1.4.0
Using actioncable 6.1.3.2
Using haml-rails 2.0.1
Using sass-rails 5.1.0
Using jquery-rails 4.4.0
Using rspec-rails 5.0.1
Using web-console 4.1.0
Using webpacker 5.2.1
Using actionmailbox 6.1.3.2
Using actiontext 6.1.3.2
Using sassc-rails 2.1.2
Using responders 3.0.1
Using bootstrap 4.4.1
Using rails 6.1.3.2
Using factory_bot_rails 6.1.0
Using devise 4.7.3
Using turbo-rails 0.5.9 from https://github.com/hotwired/turbo-rails.git (at main@2945dcb)
Using stimulus-rails 0.2.3
Using stripe-rails 2.3.0
Using universal-track-manager 0.6.1.alpha
Using paranoia 2.4.3
Using spf-query 0.1.5 from https://github.com/trailofbits/spf-query.git (at master@6dac502)
Installing mysql2 0.5.3 with native extensions
Using hot-glue 0.1.1
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /Users/jason/.rvm/gems/ruby-2.6.6/gems/mysql2-0.5.3/ext/mysql2
/Users/jason/.rvm/rubies/ruby-2.6.6/bin/ruby -I /Users/jason/.rvm/rubies/ruby-2.6.6/lib/ruby/site_ruby/2.6.0 -r
./siteconf20210604-8580-1kmtwzs.rb extconf.rb
checking for rb_absint_size()... yes
checking for rb_absint_singlebit_p()... yes
checking for rb_wait_for_single_fd()... yes
-----
Using mysql_config at /opt/homebrew/bin/mysql_config
-----
checking for mysql.h... yes
checking for errmsg.h... yes
checking for SSL_MODE_DISABLED in mysql.h... yes
checking for SSL_MODE_PREFERRED in mysql.h... yes
checking for SSL_MODE_REQUIRED in mysql.h... yes
checking for SSL_MODE_VERIFY_CA in mysql.h... yes
checking for SSL_MODE_VERIFY_IDENTITY in mysql.h... yes
checking for MYSQL.net.vio in mysql.h... yes
checking for MYSQL.net.pvio in mysql.h... no
checking for MYSQL_ENABLE_CLEARTEXT_PLUGIN in mysql.h... yes
checking for SERVER_QUERY_NO_GOOD_INDEX_USED in mysql.h... yes
checking for SERVER_QUERY_NO_INDEX_USED in mysql.h... yes
checking for SERVER_QUERY_WAS_SLOW in mysql.h... yes
checking for MYSQL_OPTION_MULTI_STATEMENTS_ON in mysql.h... yes
checking for MYSQL_OPTION_MULTI_STATEMENTS_OFF in mysql.h... yes
checking for my_bool in mysql.h... no
-----
Don't know how to set rpath on your system, if MySQL libraries are not in path mysql2 may not load
-----
-----
Setting libpath to /opt/homebrew/Cellar/mysql/8.0.25_1/lib
-----
creating Makefile

current directory: /Users/jason/.rvm/gems/ruby-2.6.6/gems/mysql2-0.5.3/ext/mysql2
make "DESTDIR=" clean

current directory: /Users/jason/.rvm/gems/ruby-2.6.6/gems/mysql2-0.5.3/ext/mysql2
make "DESTDIR="
compiling client.c
compiling infile.c
compiling mysql2_ext.c
compiling result.c
compiling statement.c
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

Gem files will remain installed in /Users/jason/.rvm/gems/ruby-2.6.6/gems/mysql2-0.5.3 for inspection.
Results logged to /Users/jason/.rvm/gems/ruby-2.6.6/extensions/-darwin-20/2.6.0/mysql2-0.5.3/gem_make.out

An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling.

In Gemfile:
  mysql2
jason@MacBook-Air  % 

我已经成功运行了brew install mysql,如果我再次运行它,它会告诉我:

警告:mysql 8.0.25_1已经安装并且是最新的。 要重新安装8.0.25_1,请运行: brew reinstall mysql

4个回答

51

步骤1:

确认您已通过brew安装了openssl和MySQL:

brew install mysql

brew install openssl

如果您之前安装过openssl的版本,请尝试以下命令:

brew reinstall openssl@3

步骤2:

在Rails应用程序上运行以下命令,以确保您可以通过bundler:

gem install mysql2 -v '0.5.3' -- --with-opt-dir=$(brew --prefix openssl) --with-ldflags=-L/opt/homebrew/opt/zstd/lib

需要注意两件事情:$(brew --prefix openssl)$(...)里的内容动态替换为您机器上openssl的目录。

/opt/homebrew/opt/zstd实际上是指向您机器当前版本zstd的符号链接(它链接到类似于/opt/homebrew/opt/Cellar/zstd/1.5.2之类的东西)。

步骤3

如果你想要这个全局,运行这个命令:

bundle config --global build.mysql2 "--with-opt-dir=$(brew --prefix openssl) --with-ldflags=-L/opt/homebrew/opt/zstd/lib"

请注意,这将更改您的~/.bundler/config文件,并全局应用于Bundler。


9
这个方法在我的 M1 Mac 平台上的 Big Sur 系统中有效! - firecall
1
终于!折磨了我半天,这个方法在我的M1 Big Sur上奏效了。非常感谢! - Ye' Thura Ag
3
谢谢。这在我的Mac OS Monterey和搭载M1的MacBook Pro上起作用了。 - Tintin81
2
适用于 M1 Mac,Monterey!有一件事:对我来说,brew --prefix openssl 返回的是 openssl@3,但我在 homebrew/opt 中有 openssl@1.1,所以它会报错找不到。对于那些遇到相同问题的人,可以通过 brew install openssl 获取更新版本,或者直接指向您拥有的版本,在我的情况下是 /opt/homebrew/opt/openssl@1.1/ - Vantalk
4
不要使用 --with-ldflags=-L/opt/homebrew/Cellar/zstd/1.5.0/lib 指向特定版本,而是使用符号链接的目录,该目录将指向您拥有的任何版本:--with-ldflags=-L/opt/homebrew/opt/zstd/lib - jaygooby
显示剩余2条评论

33

在M1上尝试安装mysql2 -v 0.4.1时遇到了相同的错误
--已解决--

brew install zstd

which zstd                                                                                             

我的路径是 -> /opt/homebrew/bin/zstd
你需要检查 zstd 是链接自哪里的。

cd /opt/homebrew/bin
ls -la

zstd -> ../Cellar/zstd/1.5.0/bin/zstd
因此,您需要获取到zstd库的路径,我的路径为:

/opt/homebrew/Cellar/zstd/1.5.0/lib

然后用一些魔术来进行经典组合

bundle config --local build.mysql2 "--with-ldflags=-L/opt/homebrew/Cellar/zstd/1.5.0/lib"
bundle install

gem list my                                                                                                 

*** LOCAL GEMS ***

mysql2 (0.4.10)

它工作得非常好!非常感谢你! - Baran Yeni
这是一个很好的示例,展示了如何在Homebrew中全局设置它;上面接受的答案应该有一个详细的步骤说明,并展示如何先通过gem install使其正常工作,然后再全局更改您的bundler文件。 - Jason FB
非常感谢。它开始让我感到恼火了。 - Eyewritecode

18

这是在 M1 上对我有效的方法。

首先确保你已经安装了 mysql 和 Homebrew 的 openssl。

brew install mysql
brew install openssl

然后手动为mysql2的安装设置这些值。我的zstd路径与Octocats相同,所以请务必遵循他们的指示并相应更改--with-ldflags选项。

bundle config --local build.mysql2 "--with-opt-dir="$(brew --prefix openssl) --with-ldflags=-L/opt/homebrew/Cellar/zstd/1.5.0/lib""

有人知道 pip 的替代方案吗? - alejandrosobko
这是我在 Apple M1 上唯一有效的解决方案。 - Tintin81

10
这种情况发生在我使用搭载 M1 芯片的 MacOS 11.6(Big Sur)系统中。
尝试:
brew install mysql

那么
gem install mysql2 -- --with-opt-dir="$(brew --prefix zstd)"

这对我有效。

如果有效,那么可以使用以下方法配置Bundler自动为您执行此操作(在此目录中即“local”):

bundle config --local build.mysql2 "--with-opt-dir="$(brew --prefix zstd)""

然后运行bundle install即可。


1
这个答案对我在使用openssl时有效,例如:gem install mysql2 -- --with-opt-dir="$(brew --prefix openssl)"但是出于某种原因,当我使用bundle config命令保存设置时,无法使其工作。 - subelsky
@subelsky 你在设置 Bundler 配置后是否使用了 bundle install 命令?gem install 命令并不知道 Bundler 的配置。你可以在包含应用程序 Gemfile 的目录中使用 bundle config list 命令来检查已设置的配置。 - Rob Simpson
这是一个很好的观点,我认为我一直在兔子洞里试图让那个命令单独通过。 - subelsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接