尝试使用 mysql2 gem 安装应用程序时出错

Posted

技术标签:

【中文标题】尝试使用 mysql2 gem 安装应用程序时出错【英文标题】:Error when trying to install app with mysql2 gem 【发布时间】:2015-08-30 07:32:35 【问题描述】:

我正在尝试安装一个使用 mysql2 gem 的开源 rails 3.2.21 应用程序,但是当我尝试运行 bundle 命令时,我收到以下错误:

Fetching: mysql2-0.3.18.gem (100%)
Building native extensions.  This could take a while...
p
ERROR:  Error installing mysql2:
    ERROR: Failed to build gem native extension.

    /Users/my_username/.rvm/rubies/ruby-2.1.2/bin/ruby -r ./siteconf20150614-72129-orqsb7.rb extconf.rb
checking for ruby/thread.h... yes
checking for rb_thread_call_without_gvl() in ruby/thread.h... yes
checking for rb_thread_blocking_region()... yes
checking for rb_wait_for_single_fd()... yes
checking for rb_hash_dup()... yes
checking for rb_intern3()... yes
-----
Using mysql_config at /usr/local/bin/mysql_config
-----
checking for mysql.h... yes
checking for errmsg.h... yes
checking for mysqld_error.h... yes
-----
Don't know how to set rpath on your system, if MySQL libraries are not in path mysql2 may not load
-----
-----
Setting libpath to /usr/local/Cellar/mysql/5.6.25/lib
-----
creating Makefile

make "DESTDIR=" clean

make "DESTDIR="
compiling client.c
compiling infile.c
compiling mysql2_ext.c
compiling result.c
linking shared-object mysql2/mysql2.bundle
ld: warning: directory not found for option '-L/Users/travis/.sm/pkg/active/lib'
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 /Users/my_username/.rvm/rubies/ruby-2.1.2/lib/ruby/gems/2.1.0/gems/mysql2-0.3.18 for inspection.
Results logged to /Users/my_username/.rvm/rubies/ruby-2.1.2/lib/ruby/gems/2.1.0/extensions/x86

我尝试卸载我通过自制软件安装的每个版本的mysql 并重新安装它们,如下所示:

brew uninstall --force mysql && brew install mysql

然后运行:

sudo gem install mysql2

正如在此处提出的许多类似问题所建议的那样,但仍会导致与上述相同的错误。

请有人提供有关如何启动和运行它的指导吗?

【问题讨论】:

尝试运行“brew doctor”并检查是否有任何错误。如果是这样,请按照说明重试。 你安装gem的依赖了吗? github.com/brianmario/mysql2#general-instructions @ValAsensio,我非常不同意你的观点,如果可能的话,我认为你应该总是尝试在开发中使用你的生产数据库。我从不在开发中使用 sqlite,也没有与我合作的任何人。 @niels。是的。我同意这个“我认为你应该总是尝试在开发中使用你的生产数据库”,我的这个古老的评论是没有用的。我删了。 【参考方案1】:

Monterey M1 Mac 上的步骤

brew install openssl@3

brew install zstd

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

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

bundle install

【讨论】:

安装 mysql2 的第三行在带有 Monterey 的 M1 Mac 上生成此错误:linking shared-object mysql2/mysql2.bundle ld: warning: directory not found for option '-L/opt/homebrew/Cellar/zstd/1.5.0/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 Gem files will remain installed in /Users/u/.gem/ruby/2.6.5/gems/mysql2-0.5.3 for inspection. Results logged to /Users/u/.gem/ruby/2.6.5/extensions/-darwin-21/2.6.0-static/mysql2-0.5.3/gem_make.out【参考方案2】:

Mac Catalina 使用 Homebrew 修复: gem install mysql2 -- --with-opt-dir="$(brew --prefix openssl)"

【讨论】:

【参考方案3】:

在 MacBook air M1(macOS) 上它对我有用。

安装zstd

brew install zstd

安装mysql2

gem install mysql2 -v '0.5.3' --with-opt-dir=$(brew --prefix openssl) --with-ldflags=-L/opt/homebrew/Cellar/zstd/1.5。 0/库

【讨论】:

这是唯一在 M1 Mac Mini 上对我有用的东西。感谢您发布! 感谢这篇文章!【参考方案4】:

在 Homebrew 更新 (openssl@1.1) 后有一个新的库路径,所以可以使用:

bundle config build.mysql2 --with-opt-dir=$(brew --prefix openssl)
bundle install

它将修复ld: library not found for -lssl error

【讨论】:

就是这样。【参考方案5】:

您似乎错过了构建mysql2 gem 所需的主要文件

sudo apt-get install libsqlite3-dev libmysqlclient-dev -y

libsqlite3-dev 不是强制性的,但安装它,因为它是默认的 rails 数据库。

【讨论】:

【参考方案6】:

命令组合解决了我。我在莫哈韦沙漠。

brew reinstall openssl && brew link openssl --force

然后

gem install mysql2 -v '0.4.10' -- \
  --with-ldflags=-L/usr/local/opt/openssl/lib \
  --with-cppflags=-I/usr/local/opt/openssl/include

【讨论】:

【参考方案7】:

错误日志说:

ld: library not found for -lssl

所以,你需要安装libssl

brew install openssl

正如在 cmets 中指出的那样,可能需要将路径导出到库。

export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/opt/openssl/lib/

【讨论】:

这还不够,之后需要像这样导出它:export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/opt/openssl/lib/ export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/opt/openssl/lib/` 经过长时间的尝试后对我有用。谢谢!! 为什么 Ruby 比任何其他生态系统都遭受这个问题的影响如此之大?为什么 Gem 开发人员不努力打造良好的安装流程? @AndyRay 这绝对不是 ruby​​ 的错,而是 MacOS。这个操作系统从来不适合开发。【参考方案8】:

基于here的解决方案

brew install openssl

export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/opt/openssl/lib/

解决了问题。

【讨论】:

export 真的很有帮助。即使使用现有的 openssl,路径也丢失了。【参考方案9】:

试试这个:

gem install mysql2 -v '0.5.2' -- --with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include

(酌情更新版本)

【讨论】:

鉴于未找到 SSL 库,这是正确的方法,对我来说效果很好。 首先安装 brew install openssl 然后 gem install mysql2 -v '0.4.10' -- --with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include 为我工作,谢谢! @TouseefMurtaza 你的回答对我有用——谢谢!【参考方案10】:
sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /

从这里: https://gorails.com/setup/osx/10.14-mojave

【讨论】:

【参考方案11】:

我发现我必须使用--with-opt-dir=/usr/local/opt

具体来说,我在~/.bundle/config 文件中添加了以下内容:

BUNDLE_BUILD__MYSQL2: "--with-opt-dir=/usr/local/opt"

【讨论】:

【参考方案12】:

我的解决方案是安装 Xcode 命令行工具。

我最近通过 Mac App Store 更新了 Xcode,每次这样做时,我发现我必须重新安装命令行工具。

xcode-select --install

【讨论】:

【参考方案13】:

对于仍然遇到此问题的任何人:

当您通过 brew 安装 openssl 时,您应该会收到以下消息:

Apple 已弃用 OpenSSL,转而使用自己的 TLS 和加密库

通常不会对您造成任何后果。如果你建立你的 自己的软件,它需要这个公式,你需要添加到你的 构建变量:

LDFLAGS:-L/usr/local/opt/openssl/lib CPPFLAGS:-I/usr/local/opt/openssl/include PKG_CONFIG_PATH: /usr/local/opt/openssl/lib/pkgconfig

您可以通过运行以下命令设置这些构建标志(用于本地应用程序):

bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"

这对我有用。

更多信息请参见bundler's documentation。

【讨论】:

如果你只想使用gem install,下面的工作:gem install mysql2 -v '0.3.21' -- --with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include @the12 niels 的解决方案适用于gem install,我的解决方案适用于bundle install。您具体遇到什么问题,您可以发布错误吗?我发布的解决方案对我仍然有效。 我从尝试bundle install 获取依赖于 mysql 的 repo 开始。 @AlessandroBerardi 的解决方案对我不起作用; @niels 做到了。 :// bundle config 命令对我不起作用(尽管过去有)。 niels 的“gem install”命令确实有效(几小时后)。 bundle config 命令失败,因为它看起来像将 --with-ldflags 和 --with-cppflags 作为参数传递给产生 clang 的 clang:错误:不支持的选项 '--with-cppflags=-I/usr/local/opt/openssl /包括' --with-cppflags 似乎在最新的 OSX 上中断。相信可以省略。bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib"【参考方案14】:

感谢@mudasobwa 为我指明了正确的方向。原来错误是由未链接的openssl文件引起的,所以运行:

brew reinstall openssl && brew link openssl --force 

解决了这个问题。我在这里找到了解决方案:OpenSSL, RVM, Brew, conflicting error

【讨论】:

以上是关于尝试使用 mysql2 gem 安装应用程序时出错的主要内容,如果未能解决你的问题,请参考以下文章

通过 Bundler 安装 mysql2 gem 时出错

错误:安装 mysql2 时出错:错误:无法在 AWS Linux 上构建 gem 原生扩展

在 Ubuntu 20.04 上安装 mysql2 gem 版本“0.3.21”时出错

如何在 Ubuntu 16.04 上安装 mysql2 [错误:安装 mysql2 时出错:错误:无法构建 gem 本机扩展。] [重复]

安装 mysql2 gem 错误

无法安装 mysql2 gem