ruby - 究竟什么是 gem native 扩展?

标签 ruby rubygems

我觉得 native 扩展就像库一样,您应该在尝试安装依赖于 native 扩展的那些 gem 之前将其安装到系统中。像 ImageMagic 库。那是对的吗?关于 native 扩展,还有什么我们应该了解的吗?

最佳答案

gem native 扩展可能链接到需要预安装的单独库,RMagick 就是一个例子。

但是,该术语实际上仅表示“包括一些需要为您的机器编译的代码”。代码被编译和链接,因此生成的可执行文件可以被机器上的 Ruby 要求

编写 Ruby C 或 C++ 扩展的常见原因是:

  • 速度。对于一些 CPU 密集型任务,C 代码可以比 Ruby 快 100 倍。在这种情况下, native 扩展可以完全独立于 gem 中包含的所有 C 源代码。

  • 已经用 C 编写的第三方库。在这种情况下,gem 将具有将库函数绑定(bind)到 Ruby 模块、类和方法中的 C 源代码。

您可以查看带有原生扩展的 Gem 的 C 源代码,它与 Ruby 源代码一起安装。按照惯例,gem 中有一个名为 ext/gem_name 的文件夹,其中包含一个将信息传递给编译器的 Ruby 文件 extconf.rb(技术上它会创建一个 make file ).此外,C 源文件也放在那里。

MRI Ruby 是用C 实现的一个非常“扁平”的结构,基本上由大量的C 函数组成。这使得学习如何实现 native 扩展相对容易,即使您不太了解 C。您可以阅读 Extending Ruby 1.9作为主题的介绍。

native 扩展可能无法安装或无法正常工作。 Stack Overflow 上有很多问题,寻求有关特定失败安装的帮助。常见的问题是:

  • 缺少库。希望 gem 作者会在 README 中解释您需要预安装的内容,但并不总是很清楚。

  • 编译器不匹配。很难测试所有的目标系统,所以有时 extconf.rb 中的指令在特定系统上不起作用,或者 C 代码会发出警告或由于差异而无法编译。在 Windows 中,除非安装 Ruby Devkit,否则您可能无法使用编译器。

  • 不适用于所有版本的 Ruby。例如,JRuby 可以使用 C 原生扩展,如果它已启用但并不总是可取的 - 这个主题非常复杂,但通常避免混合使用 JRuby 和原生扩展。

    <

关于ruby - 究竟什么是 gem native 扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31202707/

相关文章:

ruby - 如何从哈希表中获取特定值

ruby-on-rails - 如何在 Rails 中的 CSV 解析期间更改编码

ruby - 从命令行通过 capistrano 在远程主机上运行命令

ruby - 无法在 mac 上为 ruby​​ 安装 Mechanize

ruby - 您的 Ruby 版本是 2.0.0,但您的 Gemfile 指定为 2.1.1

ruby - 我安装了一个 gem 但 require 'gemname' 不起作用。为什么?

ruby-on-rails - capybara 登录测试

ruby - 模型中的 RSpec 模拟或 stub super

rubygems - Rails 5 更新后,使用未定义的方法 `select_recurring' 重复选择 gem 失败

ruby-on-rails - bundle 安装在 Rails 应用程序中创建 'parallel' 文件夹