代码之家  ›  专栏  ›  技术社区  ›  horseyguy

如何在RubyGem中包装RubyC扩展?

  •  9
  • horseyguy  · 技术社区  · 16 年前

    我找不到很多关于这个的文件。如何打包gem,以便在安装gem时编译C扩展?

    我特别想这样做:

    • 在Linux和MacOSX上,我想编译gem安装上的C扩展

    • 在Windows上,我只想安装一个预编译的。

    关于这个的任何帮助,特别是示例源,都将非常有用:)

    2 回复  |  直到 8 年前
        1
  •  14
  •   PhilT    12 年前

    Luis Lavena 创造了 rake-compiler 就为了这个目的。

    但是,您确定需要C扩展吗?关于C扩展,每个Ruby实现都有自己的C扩展API(而非基于C的实现,如xruby、jruby、ruby.net、ironruby、hortruby、maglev、red sun一点都没有),这意味着C扩展只能在 实施。而且,因为MRI 只有 实现Ruby1.8和Yarv 只有 实现Ruby1.9,我们目前处于1.8和1.9之间的过渡阶段,很多人可能会使用至少两种不同的实现。(我个人使用5个:核磁共振,雅尔夫,JRuby,IronRuby和Rubinius。)

    也许你最好用 Ruby-FFI . Ruby FFI是Ruby的一个FFI(外部函数接口)( 杜赫 ,它允许您以一种在Ruby实现中可移植的方式绑定和映射纯Ruby中的C库。FFI API最初是由 Evan Phoenix 作为的本机扩展API Rubinius ,然后被采纳 Charles Oliver Nutter (由执行) Wayne Meissner )用于 JRuby . Wayne 然后还写了 Ruby-FFI gem 包含MRI和Yarv的C扩展。 Laurent Sansonetti 为实现Ruby FFI MacRuby , Marc-André Cournoyer tinyrb supports FFI (再次由 韦恩迈斯纳 ) MagLev 开发人员也在研究它。这意味着,如果您可以使您的库与FFI一起工作,而不是使用C扩展,那么您将自动支持6个Ruby实现,而不是一个。

    如果你真的 需要一些特定于实现的行为。其中一个例子是 ParseTree gem,深入到mri的肠道,撕开解析树的内存表示。

    最后但不是最不重要的,看看 Nice-FFI 项目通过 John Croisant 目的是利用 红宝石FFI 甚至更好。

        2
  •  0
  •   Douglas G. Allen    8 年前

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

    Ruby_C_extensions

    在Github上寻找一些已经为您的研究编写的gems的好例子可能会有所帮助,但是继续进行克隆,看看您是否可以在您的系统上构建gems。如果把它们放在一起,就可以建造得很好。

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

    Python Programming Environment Setup

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

    我在Windows上使用devkit,它对我很有用。不管怎样,工具的安装都是最重要的。

    我还使用rake编译器和hoe来设置文件夹结构。所以看起来我们得用耙子和锄头来修剪花园。-D

    推荐文章