Ruby:mysql2-Gem无法正常工作(Mac OS X Snow Leopard,Ruby 1.9.2)

我刚刚编译了ruby并安装了rubygems,mysql2和rails,它运行得很好。 但每当我尝试启动rails服务器时,我都会收到以下错误消息:

 /usr/local/ruby/lib/ruby/gems/1.9.1/gems/mysql2-0.2.6/lib/mysql2.rb:7:in`requiret':dlopen(/ usr / local / ruby​​ / lib / ruby /gems/1.9.1/gems/mysql2-0.2.6/lib/mysql2/mysql2.bundle,9):未加载库:libmysqlclient.18.dylib(LoadError)引用自:/ usr / local / ruby​​ / lib / ruby / gems / 1.9.1 / gems / mysql2-0.2.6 / lib / mysql2 / mysql2.bundle原因:找不到图像 -  /usr/local/ruby/lib/ruby/gems/1.9.1/gems/mysql2- 0.2 / lib / mysql2 / mysql2.bundle来自/usr/local/ruby/lib/ruby/gems/1.9.1/gems/mysql2-0.2.6/lib/mysql2.rb:7:in`'from / usr / local / ruby​​ / lib / ruby​​ / gems / 1.9.1 / gems / bundler-1.0.10 / lib / bundler / runtime.rb:68:在`require'来自/ usr / local / ruby​​ / lib / ruby​​ / gems / 1.9.1 / gems / bundler-1.0.10 / lib / bundler / runtime.rb:68:来自/usr/local/ruby/lib/ruby/gems/1.9的`block(2 level)in require'。 1 / gems / bundler-1.0.10 / lib / bundler / runtime.rb:66:in / each'from /usr/local/ruby/lib/ruby/gems/1.9.1/gems/bundler-1.0.10/ lib / bundler / runtime.rb:66:来自/usr/local/ruby/lib/ruby/gems/1.9.1/gems/bundler-1.0.10/的`block in require'  lib / bundler / runtime.rb:55:来自/usr/local/ruby/lib/ruby/gems/1.9.1/gems/bundler-1.0.10/lib/bundler/runtime.rb:55的“each”:在来自/usr/local/ruby/lib/ruby/gems/1.9.1/gems/bundler-1.0.10/lib/bundler.rb:120:in的'require'来自/ Users / filzo / Documents / rails / blog / config / application.rb:7:in`'from /usr/local/ruby/lib/ruby/gems/1.9.1/gems/railties-3.0.5/lib/rails/commands.rb:28 :来自/usr/local/ruby/lib/ruby/gems/1.9.1/gems/railties-3.0.5/lib/rails/commands.rb:28:,,,,,,,,,, from from from / usr / local / ruby​​ / lib / ruby​​ / gems / 1.9.1 / gems / railties-3.0.5 / lib / rails / commands.rb:27:来自/ usr / local / ruby​​ / lib / ruby​​ / gems /的`tap' 1.9.1 / gems / railties-3.0.5 / lib / rails / commands.rb:27:在''from script / rails:6:in'require'from script / rails:6:in`' 

我尝试了几种可能的解决方案(例如: http: //railsforum.com/viewtopic.php?pid = 23125#23125 with libmysqlclient.18.dylib); 但没有什么对我有用。 我希望你能帮助我。

编辑:这似乎解决了我的问题:

sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/ruby/lib/ruby/gems/1.9.1/gems/mysql2-0.2.6/lib/mysql2/mysql2.bundle 

无论如何; 它是MySQL或ruby代码中的错误吗?

一种简单而最好的方法是通过命令创建软链接 –

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

http://rorguide.blogspot.com/2011/07/getting-error-library-not-loaded.html

这似乎是MySQL二进制发行版中已知(并且未修复 !)的错误 。

虽然在mysql2.bundle文件上运行install_name_tool会有效,但是如果你删除并重建它们,你就会回到原点。 此外,您必须将此修复程序应用于链接它的任何其他内容。 更好的解决方案是解决库本身的问题:

 $ sudo install_name_tool -id \ /usr/local/mysql/lib/libmysqlclient.18.dylib \ /usr/local/mysql-5.5.12-osx10.6-x86_64/lib/libmysqlclient.18.dylib 

删除并重建mysql2 gem:

 $ gem uninstall mysql2 $ gem install mysql2 

…将获取对库的更改,一切都应该正常工作,而不必修改任何环境变量。

如果您在Mac OS X上使用RVM(一个很好的选择) – 这是最终适合我的魔术命令。

 sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib /Users/*USERNAME*/.rvm/gems/ruby-1.9.2-p180/gems/mysql2-0.2.6/lib/mysql2/mysql2.bundle 

根据您当前的设置,在语法中替换USERNAME 。 如果您的mysql gem版本不同,那么也会改变。

install_name工具的一个更好的替代方法是将mysql lib的路径添加到您的DYLD_LIBRARY_PATH环境变量中。 在/ etc / profile中:

 export DYLD_LIBRARY_PATH=/usr/local/mysql/lib 

或者,由于我也安装了Oracle Instant Client,请执行以下操作:

 export ORACLE_HOME="/usr/local/oracle/instantclient_10_2" export DYLD_LIBRARY_PATH=$ORACLE_HOME export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:/usr/local/mysql/lib 

尝试使这个符号链接,所以rake可以找到正确的MySQL客户端库。

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

我不确定这是否有帮助,但我使用的是OS X 10.7.1 Lion。 在我的情况下,我打开了一个终端窗口,转到/Library/Ruby/Gems/1.8/gems/mysql2-0.3.7并且我一旦RVM咆哮说它遇到了新的或修改过的.rvmrc文件。 该文件的内容是:

 rvm use 1.9.2@mysql2 --create 

它问我是否想要相信这个.rvmc文件。 我说是的,它返回了以下内容:

 Using /Users/dan/.rvm/gems/ruby-1.9.2-p290 with gemset mysql2 

完成后,我运行以下命令:

 sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib /Library/Ruby/Gems/1.8/gems/mysql2-0.3.7/lib/mysql2/mysql2.bundle 

一旦我做了,我就准备好了。 希望这可以帮助!