我觉得原生扩展就像库,你应该在尝试安装那些依赖于原生扩展的宝石之前安装到你的系统上.像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和本机扩展.
原生扩展只是一个用C(全部或部分)写成的宝石.
它可能依赖于外部库,也可能不依赖于外部库,这不是一个因素.重要的是这样的gem需要编译并且可能是平台依赖的(有理由使用C,对吧?可能是因为使用了一些低级OS API或者其他东西.但最常见的是它与图书馆).
| 归档时间: |
|
| 查看次数: |
4019 次 |
| 最近记录: |