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.rbext/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 扩展;的主要内容,如果未能解决你的问题,请参考以下文章

Rails 控制台:无法自动加载常量

Ruby on Rails:“无法加载此类文件”事件机器

Rails 5.2.0 中的“无法自动加载常量”错误

Rails 3.2 - 无法加载初始化文件的模块

Rails 3.2 - 无法加载初始化程序文件的模块

rails 应用程序给出错误“无法从 ru.yml 路径 加载翻译预期它返回一个哈希,但没有”