在OSX上使用Rails+MySQL时出现的问题:库未加载:libmysqlclient.18.dylib

125

我刚开始学习 Ruby(和 Rails)。我按照链接 http://ruby.railstutorial.org/ruby-on-rails-tutorial-book#sec:ruby 中的指示设置了 rvm 宝石,并且已经成功地使用 sqlite 进行了一切工作。

现在我想尝试将事情转换到 MySQL 上,因为这是我大部分开发所使用的。在我的 Gemfile 文件中,我已经用 mysql2 替换了 sqlite:

group :development, :test do
#  gem 'sqlite3', '1.3.5'
  gem 'mysql2'
  gem 'rspec-rails', '2.9.0'
end

但是,当我尝试在MySQL中为Rails创建数据库时,我遇到了以下问题:

$ rake db:create --trace
rake aborted!
dlopen(/Users/username/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundle, 9): Library not loaded: libmysqlclient.18.dylib
  Referenced from: /Users/username/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundle
  Reason: image not found - /Users/username/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundle

我看到其他帖子推荐通过 homebrew 重新安装 MySQL(我的是通过可下载的 DMG 安装的),但我不想这样做,因为我已经有其他数据库用于其他非 Ruby 项目。

实际上,我有 Rails 正在寻找的文件;它安装在 /usr/local/mysql/lib/libmysqlclient.18.dylib。告诉 Rails 如何定位它的最佳方法是什么?


这可能是一个重复的问题吗?https://dev59.com/j2855IYBdhLWcg3wFAHy - oldhomemovie
确实。我不能删除自己的问题吗?投票关闭为重复。 - George Armhold
28个回答

318

解决方案非常简单; 在您的~/.bash_profile或~/.profile文件中添加库路径:

MYSQL=/usr/local/mysql/bin
export PATH=$PATH:$MYSQL
export DYLD_LIBRARY_PATH=/usr/local/mysql/lib:$DYLD_LIBRARY_PATH

如果仍然不起作用(这对我有效):

sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib

有很多关于install_name_tool的博客,但它们对我不起作用,因为我使用的是OSX Lion操作系统:

sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/bin/indexer
sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/bin/search

16
符号链接对我很有用(在升级到Mountain Lion之后)。谢谢! - siannopollo
5
符号链接可以解决这个问题,特别是像在RubyMine下运行Rails这样的情况,此时.bash_profile可能并不适用。 - maksimov
2
我已经将您的DYLD_LIBRARY_PATH添加到.bash_profile中,但我还必须卸载'mysql2' gem然后重新安装它。命令如下:'gem uninstall mysql2 && gem install mysql2' - brendan
76
对于那些为了10.11而来这里的人,你们不能再把符号链接建立到usr/lib目录下了,但是可以通过在usr/local/lib目录下建立符号链接来实现:sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib - JonathanSimmons
2
@JonathanSimmons - 你刚刚救了我一命,否则我就要把剩下的头发都拔光了。原始的符号链接答案在OS X 10.11.5上不起作用,你最终会遇到错误“ln:/usr/lib/libmysqlclient.18.dylib:操作不允许”- 现在一切都正常了,我终于可以开始今天的工作了...谢谢! - Colin Adams
显示剩余5条评论

129

在El Capitan中,我遇到了ln: /usr/lib/libmysqlclient.18.dylib: Operation not permitted的错误。

在El Capitan中,/usr/lib/现在有一个受限制的标志,如果不禁用安全性就无法写入,所以我只好把链接放到/usr/local/lib中。

sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib

Rails服务器再次正常运行。


2
不需要Alex的全部回答,一个符号链接就解决了问题。 - gitb
我执行了这个操作并得到了以下错误信息:"connect': Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) (Mysql2::Error)"。 - Josh Hunter
1
@JoshHunter 我相信这是一个独立的问题。这里有一个线程 http://stackoverflow.com/questions/18449050/connect-cant-connect-to-local-mysql-server-through-socket-tmp-mysql-sock 也可能只是MySQL服务器没有运行。 - TinMonkey
是的,服务器没有运行...这个命令修复了它。sudo /usr/local/mysql/support-files/mysql.server start - Josh Hunter

76

虽然这个问题的标题完美地描述了我遇到的问题,但情况与先前的答案所描述的不同,因此解决方案也不同。

在我的情况下(El Capitan,通过Homebrew安装的mysql),brew update && brew upgrade导致mysql包升级到5.7.10(从5.6.x)。

升级导致libmysqlclient.18.dyliblibmysqlclient.20.dylib取代,但是mysql2 gem仍然依赖于前者。

为了解决这个问题,我执行了以下操作:gem uninstall mysql2 && gem install mysql2

请注意,不同的Homebrew管理的库可能会出现类似的问题(例如,请参见 我的回答)。


太好了!我将我的mysql升级到5.7...遇到了这个问题...... 接着我执行了以下步骤:
  1. gem uninstall mysql2 > 选择选项3
  2. gem install mysql2
  3. 在项目的gemfile中添加了这个 ---> gem 'mysql2', '~> 0.3.21'
  4. bundle install
- Udit Kapahi
11
我建议每个人都先尝试这个!如果它有效,你就可以避免用其他的折中方法来弄乱你的系统。有时你不得不依赖于神奇的符号链接等,但这会让你的系统变得越来越脆弱。(如果它不起作用,也不会有任何损害和需要撤销的事情。) - Tom Wilson
我也试过了,问题是我从使用Homebrew安装MySQL转为使用官方安装程序。 - lmiller1990
1
对于任何使用Python的用户,pip uninstall mysqlclientpip install mysqlclient也可以解决问题。 - Peter Dolan
我也会推荐每个人先尝试这个!!!!如果您在gem安装后更改了mysql版本,则可能会遇到此问题。因此,最好卸载并重新安装mysql gem。 - Chetan Kumar
我也试过了,谢谢! - Son Tr.

26
sudo ln -s /usr/local/mysql-5.5.25-osx10.6-x86_64/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib

那对我有用。我从dmg文件中安装了MySQL。


4
操作不允许(使用sudo),我的操作系统版本是El Capitan。 - Ignacio Chiazzo

16
sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib

对我有用。所有类似的都没有。


这是RubyMine的解决方案。 - Justin

14

在完全卸载并重新安装MySQL后,我遇到了这个问题。具体来说:

Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.20.dylib

我甚至还没有碰过我的Rails应用程序。

重新安装mysql2 gem解决了这个问题。

$ gem uninstall mysql2
$ gem install mysql2 -v 0.3.18 # (specifying the version found in my Gemfile.lock)

[MySQL 5.7.10、Rails 4.0.0、Ruby 2.0.0、Mac OS X Yosemite 10.10]


9
如果你在El Capitan上使用从HomeBrew安装的MySQL,那么你应该按照以下方式进行链接:
sudo ln -sf /usr/local/Cellar/mysql/5.6.27/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib

8

只是为了记录:$ gem pristine mysql2 对我来说解决了这个问题。


是的,它对于 rails 部分有效,但在尝试执行数据库查询时仍然无法工作。 - Victor

6

针对从DMG安装在Mavericks系统中的MySql 5.6版本:

sudo ln -s /usr/local/mysql-5.6.14-osx10.7-x86_64/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib

4

我确认 Abhishek 的补丁确实有效。

这也适用于 Yosemite。

注意: 不要链接到特定版本的 mysql,而是使用已经构建的 mysql 符号链接:

sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib

这个解决方案适用于Xcode和C API。


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