什么是宝石原生扩展?

Dan*_*ean 15 ruby rubygems

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

Nei*_*ter 19

gem本机扩展可能链接到需要预安装的单独库,并且RMagick是其中的一个示例.

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

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

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

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

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

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

本机扩展可能无法安装或正常工作.Stack Overflow上有很多问题需要特定失败安装的帮助.通常的问题是:

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

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

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

  • 感谢您提供如此广泛的答案!我希望看到这样的答案。 (2认同)

Sim*_*tti 7

引用这篇文章

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

在此处输入图片说明

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

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

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


Ser*_*sev 7

原生扩展只是一个用C(全部或部分)写成的宝石.

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