Rails - 无法运行应用程序:无法加载 EventMachine C 扩展;
Posted
技术标签:
【中文标题】Rails - 无法运行应用程序:无法加载 EventMachine C 扩展;【英文标题】:Rails - cannot run app: Unable to load the EventMachine C extension; 【发布时间】:2013-01-27 06:26:46 【问题描述】:当我在 Lion OS X 上运行应用程序时,我收到此错误:
Unable to load the EventMachine C extension; To use the pure-ruby reactor, require 'em/pure_ruby'
/Users/adam/.rvm/gems/ruby-1.9.2-p290/gems/eventmachine-1.0.0/lib/eventmachine.rb:8:in `require': no such file to load -- rubyeventmachine (LoadError)
from /Users/adam/.rvm/gems/ruby-1.9.2-p290/gems/eventmachine-1.0.0/lib/eventmachine.rb:8:in `<top (required)>'
from /Users/adam/.rvm/gems/ruby-1.9.2-p290@global/gems/bundler-1.0.21/lib/bundler/runtime.rb:68:in `require'
from /Users/adam/.rvm/gems/ruby-1.9.2-p290@global/gems/bundler-1.0.21/lib/bundler/runtime.rb:68:in `block (2 levels) in require'
from /Users/adam/.rvm/gems/ruby-1.9.2-p290@global/gems/bundler-1.0.21/lib/bundler/runtime.rb:66:in `each'
from /Users/adam/.rvm/gems/ruby-1.9.2-p290@global/gems/bundler-1.0.21/lib/bundler/runtime.rb:66:in `block in require'
from /Users/adam/.rvm/gems/ruby-1.9.2-p290@global/gems/bundler-1.0.21/lib/bundler/runtime.rb:55:in `each'
from /Users/adam/.rvm/gems/ruby-1.9.2-p290@global/gems/bundler-1.0.21/lib/bundler/runtime.rb:55:in `require'
from /Users/adam/.rvm/gems/ruby-1.9.2-p290@global/gems/bundler-1.0.21/lib/bundler.rb:122:in `require'
from /Users/adam/rubydev/future_computers/config/application.rb:7:in `<top (required)>'
from /Users/adam/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.2.1/lib/rails/commands.rb:53:in `require'
from /Users/adam/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.2.1/lib/rails/commands.rb:53:in `block in <top (required)>'
from /Users/adam/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.2.1/lib/rails/commands.rb:50:in `tap'
from /Users/adam/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.2.1/lib/rails/commands.rb:50:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'adam
我真的不知道如何解决这个问题,我已将 eventmachine
gem 添加到 Gemfile 中,但它没有帮助...
你能帮我吗,如何解决它?
谢谢
【问题讨论】:
bundle install
是否有任何错误?
bundle install
可以正常工作。
【参考方案1】:
在我的情况下,这解决了它:
$ gem 卸载事件机器 在提示符处告诉它卸载所有版本(它告诉你依赖关系) $ 捆绑安装我正在阅读这个https://github.com/eventmachine/eventmachine/issues/333。 eventmachine 存在问题,因此确保我获得最新版本似乎是个好主意。
【讨论】:
这对我不起作用 - 我仍然得到完全相同的错误。【参考方案2】:对我来说,使用 tweaked config 从源代码编译 eventmachine 很有帮助。试试:
如果 eventmachine 已经安装,请卸载它:
gem uninstall eventmachine
获取事件机器源:
git clone https://github.com/eventmachine/eventmachine.git
cd eventmachine
编辑ext/extconf.rb
和ext/fastfilereader/extconf.rb
文件,在require 'mkmf'
之后添加CONFIG['CXX'] = "g++"
编译安装gem:
rake gem
gem install pkg/eventmachine-1.0.3.gem
现在 eventmachine 应该可以正常工作了:)
【讨论】:
这适用于 mailcatcher 启动但不知何故破坏了我的捆绑安装.. 计算 atm 签出 v1.0.3 并进行了编辑。现在我收到了Don't know how to build task 'native:eventmachine:x86-mingw32' (see --tasks)
Elijah 你在运行 Windows 吗?这些更改在 macOS 上对我有用。这可能会对您有所帮助:github.com/eventmachine/eventmachine/issues/531【参考方案3】:
消息中说的最简单的解决方法就是发送至require 'em/pure_ruby'
。我想你可以把它放在 config/inlitializers 文件夹中,你可以调用文件 event_machine.rb
但它不会有与 C 扩展相同的性能。
【讨论】:
但是在哪里可以找到并下载该文件? 在 config/initializers 文件夹中创建它【参考方案4】:提供另一个解决方案,因为我只是浪费了几个小时来跟踪这个问题。我在做bundle install --deployment
,然后将结果提交到 git 中的一个单独分支,这样我就可以将该分支直接部署到服务器,而无需再次执行 bundle install
。
问题是 eventmachine 中有一个 .gitignore
文件,它告诉 git 忽略所有 *.so
文件。因此,当我提交时,.so
文件没有提交,并且不会在git status
中显示为未跟踪。此外,由于 gemspec 存在,bundle 认为该软件包已完全安装。
我的解决方案是在构建过程中添加一个命令,以便在提交之前对 gem 中的所有 .gitignore
文件进行处理。
【讨论】:
使用 git 存储大量二进制文件可能会很痛苦 @BlakeMiller 是的,我们最终放弃了这种方法,现在正在构建 tarball。【参考方案5】:您可能会在安装 gem 时发现各种错误,或者尝试为您的 ruby 应用程序安装因未安装 ruby-devel 而失败寻找解决方案。
我刚刚在我的 Kali linux 上安装了
sudo apt-get install ruby-dev
一切都解决了。我正在尝试安装 Bettercap。
这个答案有帮助:https://***.com/a/4502672/6503117
【讨论】:
【参考方案6】:我在 Jekyll.4.2.1-Ruby.3.0.3p137(mingw)-Windows 上运行 bundle exec jekyll serve --livereload --trace
时遇到了这个错误。我运行了gem install eventmachine --platform=ruby
,它在C:\Ruby30-x64\lib\ruby\gems\3.0.0\gems\eventmachine-1.2.7
编译,但是当你运行bundle install
时,它也会创建C:\Ruby30-x64\lib\ruby\gems\3.0.0\gems\eventmachine-1.2.7-x64-mingw32
?。命令bundle info eventmachine
给了我C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/eventmachine-1.2.7-x64-mingw32
,这在Gemfile.lock 中用eventmachine (1.2.7-x64-mingw32)
行确认。所以我将那行更改为eventmachine (1.2.7)
,然后bundle info eventmachine
的输出给了我C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/eventmachine-1.2.7
,最后命令bundle exec jekyll serve --livereload --trace
起作用了✔️
【讨论】:
以上是关于Rails - 无法运行应用程序:无法加载 EventMachine C 扩展;的主要内容,如果未能解决你的问题,请参考以下文章