什么是gem原生扩展?

时间:2015-07-03 09:01:39

标签: ruby rubygems

我觉得原生扩展就像你应该在尝试安装那些依赖于原生扩展的宝石之前安装到你的系统上的库。就像ImageMagic库一样。那是对的吗?我们应该知道有关原生扩展的其他内容吗?

4 个答案:

答案 0 :(得分:16)

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

但是,这个术语实际上只是意味着“包含一些需要为您的机器编译的代码”。编译和链接代码,以便生成的可执行文件可以由Ruby在机器上require

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

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

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

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

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

原生扩展可能无法安装或正常运行。 Stack Overflow上有很多问题需要特定失败安装的帮助。通常的问题是:

  • 缺少图书馆。希望宝石作者能够在README中解释您需要预安装的内容,但并不总是清楚。

  • 编译器不匹配。很难测试所有目标系统,因此有时extconf.rb中的指令不能在特定系统上运行,或者C代码会因为差异而引发警告或不编译。在Windows中,除非安装Ruby Devkit

  • ,否则您可能没有可用的编译器
  • 不适用于所有版本的Ruby。例如,JRuby 可以使用C本机扩展,如果它已经启用但并不总是可取的 - 主题非常复杂,但通常避免混合JRuby和本机扩展。

答案 1 :(得分:6)

原生扩展只是一个在C中写入(全部或部分)的宝石。

它可能依赖于外部库,也可能不依赖于外部库,这不是一个因素。重要的是这样的gem需要编译并且可能是平台依赖的(有理由使用C,对吧?可能是因为使用了一些低级OS API或者其他东西。但最常见的是它与库)。

答案 2 :(得分:3)

引用this article

  

“本机扩展”是将Ruby gem与计算机上存在的其他非Ruby软件组件或库连接的粘合剂。

enter image description here

原生扩展不是依赖。本机扩展通常是与非Ruby依赖项交互的C代码。

例如,使用ImageMagic的gem有一个用C语言编写的本机扩展,它与ImageMagic对话并代表从Ruby gem到ImageMagic的桥梁。

安装gem并编译本机扩展时,您不需要编译C库(例如ImageMagic),该库必须已存在于您的系统中。您编译与gem捆绑在一起的C桥。

答案 3 :(得分:1)

我不是大红宝石专家,所以请带上一粒盐:

我很确定它只是一个需要安装本机(例如C-Library)库才能工作的gem。很多宝石只是用Ruby API包装现有的C库。

安装gem将触发C库的下载,然后使用gcc或其他编译器构建。如果不支持您的系统配置,则需要将参数传递给gem工具以指示正确的目录等。如果您不幸,则可能需要直接更改make文件。