如何将 Ruby C 扩展封装在 Ruby Gem 中?

2023-11-27

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

我特别想这样做:

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

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

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


路易斯·拉韦纳已创建rake-compiler就是为了这个目的。

  • 主页/GitHub
  • GitHub 维基

但是,您确定需要 C 扩展吗?关于 C 扩展的问题是,每个 Ruby 实现都有自己的 C 扩展 API(而非基于 C 的扩展 API,如 XRuby、JRuby、Ruby.NET、IronRuby、HotRuby、MagLev、Red Sun 根本没有),这意味着你的 C 扩展只能工作在one执行。而且,自从 MRIonly实现 Ruby 1.8 和 YARVonly实现了 Ruby 1.9,而我们目前正处于 1.8 和 1.9 之间的过渡阶段,很可能很多人会使用至少两种不同的实现。 (我个人使用 5 个:MRI、YARV、JRuby、IronRuby 和 Rubinius。)

也许你最好使用Ruby-FFI。 Ruby-FFI 是 Ruby 的 FFI(外部函数接口)(duh),它允许您以跨 Ruby 实现可移植的方式绑定并映射纯 Ruby 中的 C 库。 FFI API 最初由埃文·菲尼克斯作为本机扩展 APIRubinius,然后被采用查尔斯·奥利弗·纳特(并由韦恩·迈斯纳) for JRuby. Wayne然后还写了红宝石-FFI 宝石,其中包含 MRI 和 YARV 的 C 扩展。洛朗桑索内蒂实现了 Ruby-FFIMacRuby, 马克·安德烈·库诺耶's tinyrb also 支持FFI(再次由韦恩·迈斯纳)和MagLev开发人员也在努力。这意味着,如果您可以让您的库使用 FFI 而不是 C 扩展,您将自动支持 6 种 Ruby 实现,而不仅仅是一种。

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

最后但并非最不重要的一点是,看一下Nice-FFI项目由约翰·克罗桑特,其目的是使使用Ruby-FFI更好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 Ruby C 扩展封装在 Ruby Gem 中? 的相关文章

随机推荐

  • Excel VLOOKUP 给出错误值

    我有一个 VLookup 单元格 它给了我错误的值 这是表 PID Product Price User User name Deal On Amount After in 1001 table 1001 1 Milly No 1000 i
  • 重新分配后使用原始指针?

    我正在阅读 Richard Reese 的 O Reilly 新书 2013 年 5 月 理解和使用 C 指针 我对其中第 87 页的一些代码有疑问 if length gt maximumLength char newBuffer rea
  • 保留在第二个平面数组中找到列值的数组行

    我已编辑此内容以展示如何使用 array search 让代码正常工作 我有一个数组 arr1有 5 列 key id name style age whim 0 14 bob big 33 no 1 72 jill big 22 yes
  • 从 Base64 字符串中提取图像尺寸

    是否有一种相对简单的方法 也许是正则表达式 从 base64 字符串 也许还有文件大小 检测图像的尺寸 高度和宽度 也就是说没有实际创建图像资源 解码base64 并使用getimagesizefromstring http www php
  • 我可以在 MAUI 项目中使用现有的 WinUI3 控件吗?

    是否可以在MAUI项目中使用WinUI 3现有的控件 就像控件一样https github com microsoft WinUI Gallery 我将 WinUI 包安装到我的 MAUI 项目中
  • 在 TypeScript 中,什么时候使用“let”,什么时候使用“const”?

    在 TypeScript 中 什么时候使用 let 什么时候使用 const const代表constant 这意味着该变量以后不能重新分配 let类似于var除了它是块作用域外 这意味着它可以在 a 内部声明for循环并且将位于该循环体的
  • 如何在 Three.js 中使用多个纹理并将其与自定义值混合?

    在 Three js 中 是否可以创建一种包含多个纹理的材质 着色器 每个纹理都有自己的细节 将它们混合在一起并分配给几何体 我想使用箔压花或局部紫外线上光等多种精加工技术来模拟纸张表面 我想要实现的是一种具有以下特性的材料 Base la
  • 将字符插入 SQL 字符串

    我有一个 nvarchar 列 我需要在字符串内的固定点插入连字符 连字符需要位于最右边的字符和下一个字符之间 并再次位于右侧第三个位置 例如 列值为 0000050704 我需要它是 0000050 70 4 或值为 0555256321
  • AndroidTextureView/绘图/绘画性能

    我正在尝试使用以下命令制作绘图 绘画应用程序TextureView在安卓上 我想要支持高达 4096x4096 像素的绘图表面 这对于我的最小目标设备 我用于测试的 来说似乎是合理的 即 Google Nexus 7 2013 它具有不错的
  • 匿名类的多重继承

    匿名类如何实现两个 或更多 接口 或者说 怎样才能both扩展一个类and实现一个接口 例如 我想创建一个扩展两个接口的匿名类的对象 Java 10 var is used since I don t know how to specify
  • 如何更改java DNS服务提供商

    我正在构建一个快速的网络爬虫 并且需要多线程 DNS 解析 因此我选择了一个名为的多线程 DNS 服务提供商dnsjava 不幸的是 我不知道如何替换默认的 DNS 服务提供商 我回顾了README文件 dnsjava 但说明不是很详细 替
  • 如何在 TFS 中撤消前员工的签出

    在我们的TFS源控制服务器上 很多源文件被人们签出 不再使用 是否有一种集中方式可以撤消对 TFS 中所有文件的签出 我什至不确定它们是否存在于 Active Directory 中 最好的办法是使用命令行工具 tf exe 或Attric
  • 在 MediaSource HTML5 中播放 MediaRecorder 块 - 视频冻结

    我有这个简单的代码来获取视频流块并在 MediaSource 中播放它们 我看视频 但有时会停止 它可能会工作几秒钟或几分钟 但最终它在某个时刻停止了 chrome media internals 显示没有错误 这里有什么问题吗 navig
  • 如何通过克隆当前本地环境来创建virtualenv?

    假设我有一个 python 解释器 在我的本地系统上安装了许多模块 并且它已经被调整为可以正常工作 现在我想创建一个 virtualenv 来冻结这些 这样它们就不会在将来升级时被破坏 我怎样才能做到呢 谢谢 我不能使用pip freeze
  • 如何为表单设置点击事件?

    我有一个 C 表单 我们称之为 MainForm 上面有许多自定义控件 我希望每当有人单击表单时都会触发 MainForm OnClick 方法 无论单击是发生在表单上还是单击是在自定义控件之一上 我正在寻找类似于表单的 KeyPrevie
  • 为什么我会收到“仅允许在事务内查询祖先查询”错误

    boolean r ofy transact new Work
  • PySide:将 QItemSelectionModel 与 QListView 一起使用时出现段错误(?)

    与此完全相同的问题 连接 QTableView SelectionChanged 信号会与 PyQt 产生段错误 我有一个 QListView 我想在选择一个项目时调用一个函数 self server list QtGui QListVie
  • AsyncTask API 在 Android 11 中已弃用。有哪些替代方案?

    Google 在 Android 11 中弃用 Android AsyncTask API 并建议使用java util concurrent反而 你可以查看提交here deprecated Use the standard code j
  • 如何检测浏览器窗口是否获得焦点?

    我的页面应该仅在窗口位于后台时发出通知声音 我可以追踪window onfocus and window onblur当焦点状态发生变化时要注意的事件 但是 我不知道该窗口是否会加载焦点 因为它可能会加载到后台选项卡中 在获得提示之前 如何
  • 如何将 Ruby C 扩展封装在 Ruby Gem 中?

    我找不到很多关于此的文档 如何打包 gem 以便在安装 gem 时编译 C 扩展 我特别想这样做 在 Linux 和 MacOSX 上 我想在 gem install 上编译 C 扩展 在 Windows 上我想简单地安装一个预编译的 so