我觉得 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/