38

启动 Rails 服务器时出现以下错误:

$ rails server
/Users/ssmith/.rvm/gems/ruby-1.9.2-p0/gems/mysql2-0.2.6/lib/mysql2.rb:7:in `require':     dlopen(/Users/ssmith/.rvm/gems/ruby-1.9.2-p0/gems/mysql2-0.2.6/lib/mysql2/mysql2.bundle, 9): Library not loaded: libmysqlclient.16.dylib (LoadError) 
Referenced from: /Users/ssmith/.rvm/gems/ruby-1.9.2-p0/gems/mysql2- 0.2.6/lib/mysql2/mysql2.bundle
Reason: image not found - /Users/ssmith/.rvm/gems/ruby-1.9.2-p0/gems/mysql2-    
0.2.6/lib/mysql2/mysql2.bundle

在 rvm use ruby​​-1.9.2-p0 命令之后,我使用以下命令安装了 mysql2:

$ gem install mysql2 -- --with-mysql-dir=/usr/local/mysql --with-mysql-config=/usr/local/mysql/bin/mysql_config
Building native extensions.  This could take a while...
Successfully installed mysql2-0.2.6
1 gem installed
Installing ri documentation for mysql2-0.2.6...
Enclosing class/module 'mMysql2' for class Client not known
Installing RDoc documentation for mysql2-0.2.6...
Enclosing class/module 'mMysql2' for class Client not known

我的 Gemfile 和 database.yml 文件中都有 mysql2,并且捆绑安装完成得很好

$ bundle show mysql2
/Users/ssmith/.rvm/gems/ruby-1.9.2-p0/gems/mysql2-0.2.6

我知道 Rails 服务器错误是由于它不知道 OSX 上的 mysql_config 位置,但是在 gem install 上我指定了正确的位置。然而,RVM 的 gem 似乎并不尊重 mysql_config 的位置。

有人对此有解决方案吗?

4

9 回答 9

64

问题来自 mysql2 gem 缺少 MySQL 的动态库。

install_name_tool ...比需要更新DYLD_LIBRARY_PATH以向其添加 MySQL 库的更清洁的解决方案。为此,请更新您的~/.bash_profile以添加 MySQL 库文件夹:

export DYLD_LIBRARY_PATH="/usr/local/mysql/lib:$DYLD_LIBRARY_PATH"

注意:您可能希望根据您的安装更新 MySQL 位置

这应该保持干净,但也确保任何需要 MySQL 动态库的 gem 或代码都能找到它们。

参考: http: //lightyearsoftware.com/2011/02/mysql-5-5-on-mac-os-x/

参考更新 2012 年 7 月: OS X 10.8 中的更改使上述简单方法不那么优雅。如果设置该变量,则每次运行 setuid 或 setgid 程序时,都会在 stderr 上收到以下警告:

dyld: DYLD_ environment variables being ignored because main executable (...) is setuid or setgid

使用 Phusion Passenger Standalone 的 Ruby 开发人员将每五秒钟在他们的控制台中看到此消息。它变得非常烦人,非常快。

我已经向 Apple 提交了一个错误。它也在 OpenRadar 上。

同时,还有第三种方法可以修复客户端库路径问题,不需要设置 DYLD_LIBRARY_PATH(解决这个 10.8 问题)或使用 install_name_tool 破解 .bundle 文件:

$ brew install mysql
于 2011-04-01T05:59:17.777 回答
22

我在这里找到了答案:Mysql 5.5, Snow leopard and rails

sudo install_name_tool -change libmysqlclient.16.dylib /usr/local/mysql/lib/libmysqlclient.16.dylib ~/.rvm/gems/ruby-1.9.2-p0/gems/mysql2-0.2.6/lib/mysql2/mysql2.bundle
于 2010-12-25T16:43:32.987 回答
8

在 OS X 10.8 (Mountain Lion) 上,列出的答案都有问题,如答案和评论中所述。

  • 设置DYLD_LIBRARY_PATH为包含 /usr/local/mysql/lib 会从 OS X 和 brew 发出警告
  • 每次安装或升级geminstall_name_tool时,都需要重做 gem 二进制文件的外观。
  • 切换到brew的mysql 可能不行;并且无论如何我都不想重新配置已经工作的安装

恕我直言,一个更简单且强大的解决方案是将库链接放在默认动态库搜索路径中,该路径方便地包括/usr/local/lib. 那是:

ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib
于 2013-01-24T12:00:55.307 回答
5

账单,

Frederic 的回答将解决这个问题,但是您可能必须根据版本和系统上的命名方式更改命令中的某些项目。

例如,在最新版本的 mysql 上,libmysqlclient.16.dylib 实际上是 libmysqlclient.18.dylib。尝试做一个:

locate libmysqlclient.18.dylib

如果那不返回您可以转到的路径:

/usr/local/{your-mysql}/lib

找到文件。然后只需一个 PWD 即可找到该命令的正确目录。

您还需要确定已安装的 rubies 的实际软件包名称是什么。您可以使用

rvm info 

比如我安装的1.9.2是ruby-1.9.2.p180,不是ruby-1.9.2p0。这也需要在 Frederics 命令中进行更改。

所以,对我来说,弗雷德里克的命令变成了分别修复 1.8.7 和 1.9.2 的 rvm 红宝石:

sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql-5.5.10-osx10.6-x86_64/lib/libmysqlclient.18.dylib ~/.rvm/gems/ruby-1.8.7-p334/gems/mysql2-0.2.6/lib/mysql2/mysql2.bundle

sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql-5.5.10-osx10.6-x86_64/lib/libmysqlclient.18.dylib ~/.rvm/gems/ruby-1.9.2-p180/gems/mysql2-0.2.6/lib/mysql2/mysql2.bundle
于 2011-03-27T20:07:06.283 回答
3

以下来自: http: //lightyearsoftware.com/2011/02/mysql-5-5-on-mac-os-x/

2012 年 7 月更新:

OS X 10.8 中的更改使上述简单方法不那么优雅。如果设置该变量,则每次运行 setuid 或 setgid 程序时,都会在 stderr 上收到以下警告:

dyld: DYLD_ environment variables being ignored because main executable (...) is setuid or setgid

使用 Phusion Passenger Standalone 的 Ruby 开发人员将每五秒钟在他们的控制台中看到此消息。它变得非常烦人,非常快。

我已经向 Apple 提交了一个错误。它也在 OpenRadar 上。

同时,还有第三种方法可以修复客户端库路径问题,不需要设置 DYLD_LIBRARY_PATH(解决这个 10.8 问题)或使用 install_name_tool 破解 .bundle 文件:

$ brew install mysql
于 2012-11-03T20:02:31.170 回答
2

我在这个问题上停留了一段时间,然后得出了一个不同的解决方案。

请注意缺少的库是16 版

未加载库:libmysqlclient.16.dylib (LoadError)

原来我有那个库的第 20 版 -libmysqlclient.20.dylib

gem 'mysql2'在我的 Gemfile 中有正确的,但我需要做的是卸载 gem,gem uninstall mysql(我安装了多个版本的 gem)然后做一个新bundle install的以获得我需要的这个库的版本。

之后,它寻找并找到了该库的正确版本。

于 2016-05-16T23:32:31.993 回答
1

我的位置不同,我不得不使用:

sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib /Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundle.
于 2012-01-27T00:14:31.510 回答
1

将mysql升级到最新版本并重新安装mysql2 gem对我有用 brew upgrade mysql gem uninstall mysql2 gem install mysql2

顺便说一句:我的 MySQL 版本是 5.7.18,mysql2 gem 版本是 0.4.5

于 2017-07-28T03:00:06.627 回答
0

这是我所做的(与其他人类似)

sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib ~/.rvm/gems/ruby-1.9.2-p290/gems/mysql2-0.3.10/lib/mysql2/mysql2.bundle
于 2011-12-12T04:36:39.963 回答