如何在Ruby Gem中包装Ruby C扩展?

我在这方面找不到很多文档。 如何打包gem以便在安装gem时编译C扩展?

特别是我想这样做:

  • 在Linux和MacOSX上我想在gem install上编译C扩展

  • 在Windows上我想简单地安装一个预编译的.so

对此的任何帮助,特别是示例源,将非常有用:)

Luis Lavena为此目的创建了rake-compiler

  • 主页
  • 项目页面
  • GitHub项目
  • GitHub Wiki

但是,您确定需要C扩展吗? 关于C扩展的事情是每个Ruby实现都有自己的C扩展API(而非基于X的扩展,如XRuby,JRuby,Ruby.NET,IronRuby,HotRuby,MagLev,Red Sun根本没有),表示您的C扩展仅适用于一个实现。 而且,由于MRI 实现了Ruby 1.8而YARV 实现了Ruby 1.9,而且我们目前处于1.8到1.9之间的过渡阶段,很可能很多人会使用至少两种不同的实现。 (我个人使用5:MRI,YARV,JRuby,IronRuby和Rubinius。)

也许你最好使用Ruby-FFI 。 Ruby-FFI是Ruby( duh )的FFI(外部函数接口),它允许您以可在Ruby实现中移植的方式绑定和映射纯Ruby中的C库。 FFI API最初由Evan Phoenix开发,作为Rubinius的原生扩展API,然后被Charles Oliver Nutter (由Wayne Meissner实施)用于JRuby 。 韦恩随后还编写了Ruby-FFI gem ,其中包含用于MRI和YARV的C扩展。 Laurent Sansonetti为MacRuby实施了Ruby-FFI, Marc-AndréCournoyer的tinyrb也支持FFI (再次由Wayne Meissner编写), MagLev开发人员也正在研究它。 这意味着如果你可以让你的库使用FFI而不是C扩展,你将自动支持6个Ruby实现,而不仅仅是一个。

如果您确实需要某些特定于实现的行为,那么使用C扩展而不是FFI扩展的唯一原因是。 其中一个例子就是ParseTreegem,它深入到MRI的肠道并撕掉了解析树的内存中表示。

最后但并非最不重要的是,看看John Croisant的Nice-FFI项目,该项目旨在使Ruby-FFI更加出色 。

我有一个github回购,我维护只是为了我自己的参考,这些东西帮助了我。

Ruby_C_extensions

它可能有助于在github上查找已经为您的研究编写的gem的一些好例子,但继续克隆它们,看看您是否可以在您的系统上构建它们。 如果将它们组合在一起它们应该构建得很好。

请注意,您在任何正在使用的平台中都需要一些构建工具。 这是我刚看过的一段video,它告诉你Linux需要什么。

Python编程环境设置

现在我知道它说Python,他确实向您展示了如何安装构建工具包。

我使用DevKit for Windows,它适用于我。 对于任何事情,安装工具是最重要的。

我也使用rake-compiler和hoe来设置文件夹结构。 因此看起来我们必须通过耙子和锄头来减少一些园艺。 😀