问题标签 [ruby-c-extension]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
300 浏览

c - 使用 Ruby C API 在模块中定义类

我正在尝试使用 Ruby C API 在模块内定义一个类。但是,我在网上看到的这种方式似乎对我不起作用。具体来说,创建了顶级模块,但在模块中找不到该类。这是我的 C 文件:

这是我的 extconf.rb:

这是我的测试脚本:

有人可以帮忙吗?

0 投票
1 回答
247 浏览

ruby - C-API 中的 Python 模块语义与 Ruby 模块语义

我已经使用 Python 很长时间了,而且我刚刚开始玩弄 Ruby,但是我发现这两种语言中模块之间的差异确实令人困惑,尤其是通过它们的 C-API 来查看时。例如,这里是一个小的 ruby​​ C 模块

当我像这样导入并调用它时

我希望它的工作方式类似于 python 模块的工作方式。但是,我发现我必须使用PyModule来扩展一个类,或者我必须使用include "PyModule". 我正在寻找一种PyModule将这些函数附加到类似于 Python 语义的模块对象的方法。我也很好奇 Ruby 中实际发生的事情导致了这种行为。

0 投票
3 回答
1551 浏览

c++ - 如何将 C/C++ 结构绑定到 Ruby?

我需要一些建议如何将 C/C++ 结构绑定到 Ruby。我已经阅读了一些手册,并且发现了如何将类方法绑定到类,但我仍然不明白如何绑定结构字段并使它们在 Ruby 中可访问。

这是我正在使用的代码:

Ruby 函数似乎假定这a是一个指针。它打印指针的数值而不是它的真实内容(即["Masha", 24])。显然,Ruby 函数无法识别这个对象——我没有设置对象的属性名称和类型。

我怎样才能做到这一点?不幸的是,我无法弄清楚。

0 投票
2 回答
198 浏览

ruby - 如何根据操作系统控制 extconf.rb 生成的输出?

我正在编写一个 Ruby C 扩展。我将在 Windows 和 OSX 下编译它。

我一直无法解决的是控制生成文件和所有其他生成文件的放置位置。

我的 extconf.rb 文件有根据操作系统准备 makefile 的条件语句 - 所以我对它们都使用一个。

我希望当我在 OSX 下编译时,它都放在一个 osx 文件夹中,类似地放在 Windows 下的一个 win 文件夹下,以便将它们全部分开。

因为现在所有文件都生成在与我的源代码相同的文件夹中。

(我对 C 和编译应用程序非常熟悉。如果我遗漏了一些明显的东西,我很抱歉。)

之后我可以编写一个批处理来移动文件,但如果可以在生成期间完成,我会发现它更干净。

0 投票
3 回答
245 浏览

ruby - 如何将其他构建系统与 ruby​​gems 一起使用?

由于. _ mkmf出于这个原因,我想使用另一个构建系统。

rubygems构建 C 扩展需要什么?如何将autotools/之类的构建系统集成configure到工作流程中?

0 投票
1 回答
1084 浏览

c - 使用 rb_require 和 rb_protect 在 C 中嵌入 Ruby

我想将 rb_require 与 rb_protect 一起使用,如下例所示:

但是当我编译它时,我得到了这个错误:

在 Google 上搜索以查看如何将 rb_require 与 rb_protect 一起使用后,我尝试了:

或者

但我总是得到同样的错误。当我启动它时,此错误不会停止编译,而是二进制段错误,而在没有 rb_protect 的情况下一切正常。

__编辑__

我的源文件中有错误。事实上,我测试过的所有解决方案都运行良好:

或者

或者

谢谢

0 投票
1 回答
710 浏览

c - rb_class_new_instance 引发“ArgumentError:错误类型” - 为什么?

从我的 Ruby C 扩展中,我想Geom::Vector3d从 Google SketchUp Ruby API 创建一个新实例:https ://developers.google.com/sketchup/docs/ourdoc/vector3d

我最初的代码是这样的:

然而,这引发了一个错误:

相反,我不得不调用 rubynew​​ 方法——就像这样:

我在Geom::Point3dSketchup::Color上遇到了同样的问题。

rb_class_new_instance是在 Ruby C 中创建新实例的首选方法,对吧?有人知道我为什么需要打电话new吗?SketchUp 中类的定义方式有些奇怪?

0 投票
1 回答
193 浏览

c - 如何在 Ruby 扩展中对 VALUE* 数组进行标记?

我有一个矩阵类型,它包含一个void*数组,代表一个对象数组(它们都是给定矩阵中的一种类型,例如,所有 C 整数、所有浮点数、双精度数、各种结构,甚至可能所有 Ruby VALUE) .

在我尝试创建VALUEs 矩阵之前,内存分配和垃圾收集似乎正常工作。

我定义了以下标记函数:

VALUE所以它只在它实际上是一个矩阵时才做标记——否则,NULL被传递给Data_Wrap_Struct标记函数。

但是当我测试一些VALUE矩阵函数时,我遇到了一个段错误(参见要点)

VALUE*具体来说,当我第一次尝试在数组中的第一个对象上调用 Ruby 方法时,它似乎出现了段错误:

nm_id_mult是在我的Init函数中定义为的全局变量rb_intern("*")

这可能不是垃圾收集问题,但 GC 是我了解最少的 Ruby 部分——而且我的段错误也几乎与此 trace相同,poster 将其归因于 GC。

所以,我的问题:

  1. 如果是 GC,那么标记 s 数组的合适方法是VALUE什么?

  2. 如果不是 GC,我该如何诊断这种类型的错误?我从来没有见过这样的东西。

编辑:

事实证明,这是一个VALUE在 C 中创建的初始化 s失败的例子。

换句话说,请务必*(VALUE*)a = INT2FIX(0)在尝试访问a.

我仍然认为这个问题是相关的。在 StackOverflow 或其他地方,我还没有找到任何真正好的标记用于清洁和清除垃圾收集的示例。如果您可以提供这样的示例和/或解释,我会将其标记为该问题的正确答案。

0 投票
2 回答
869 浏览

ruby - 在开发带有 C 扩展的 ruby​​gem 时,如何使用 Rspec 在本地进行测试?

我正在编写一个包含 C 扩展的 gem。通常,当我编写 gem 时,我会遵循 TDD 的过程,在那里我将编写一个失败的规范,然后处理代码直到它通过,等等......

在“ext/mygem/mygem.c”中使用我的 C 扩展名和在 gemspec 的“扩展名”中配置的有效 extconf.rb,我如何运行我的规范并仍然加载我的 C 扩展名?当我对 C 代码进行更改时,我需要采取哪些步骤来重新编译代码?

这可能是一个愚蠢的问题,但是从我的 gem 的开发源代码树中输入“bundle install”并不会构建任何本机扩展。当我手动运行时,ruby ext/mygem/extconf.rb我确实得到了一个 Makefile(在整个项目的根目录中),然后当我运行时make,我确实得到了一个共享对象(同样,在整个项目的根目录中)。我必须遵循错误的工作流程,因为我知道 .so 应该放在 lib/ 下。除非我应该在开发过程中手动完成?

0 投票
2 回答
205 浏览

c - 在 C API 中使用 ruby​​ 的 BigDecimal

为了从 Ruby 扩展中的 C 字符串创建 BigDecimal,我这样做:

有没有更短的方法来做到这一点?

另外,愚蠢的问题,但是否有 C API(ruby 1.9.3)的“官方”文档,或者它只是归结为阅读标题?