问题标签 [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.
c - 使用 Ruby C API 在模块中定义类
我正在尝试使用 Ruby C API 在模块内定义一个类。但是,我在网上看到的这种方式似乎对我不起作用。具体来说,创建了顶级模块,但在模块中找不到该类。这是我的 C 文件:
这是我的 extconf.rb:
这是我的测试脚本:
有人可以帮忙吗?
ruby - C-API 中的 Python 模块语义与 Ruby 模块语义
我已经使用 Python 很长时间了,而且我刚刚开始玩弄 Ruby,但是我发现这两种语言中模块之间的差异确实令人困惑,尤其是通过它们的 C-API 来查看时。例如,这里是一个小的 ruby C 模块
当我像这样导入并调用它时
我希望它的工作方式类似于 python 模块的工作方式。但是,我发现我必须使用PyModule
来扩展一个类,或者我必须使用include "PyModule"
. 我正在寻找一种PyModule
将这些函数附加到类似于 Python 语义的模块对象的方法。我也很好奇 Ruby 中实际发生的事情导致了这种行为。
c++ - 如何将 C/C++ 结构绑定到 Ruby?
我需要一些建议如何将 C/C++ 结构绑定到 Ruby。我已经阅读了一些手册,并且发现了如何将类方法绑定到类,但我仍然不明白如何绑定结构字段并使它们在 Ruby 中可访问。
这是我正在使用的代码:
Ruby 函数似乎假定这a
是一个指针。它打印指针的数值而不是它的真实内容(即["Masha", 24]
)。显然,Ruby 函数无法识别这个对象——我没有设置对象的属性名称和类型。
我怎样才能做到这一点?不幸的是,我无法弄清楚。
ruby - 如何根据操作系统控制 extconf.rb 生成的输出?
我正在编写一个 Ruby C 扩展。我将在 Windows 和 OSX 下编译它。
我一直无法解决的是控制生成文件和所有其他生成文件的放置位置。
我的 extconf.rb 文件有根据操作系统准备 makefile 的条件语句 - 所以我对它们都使用一个。
我希望当我在 OSX 下编译时,它都放在一个 osx 文件夹中,类似地放在 Windows 下的一个 win 文件夹下,以便将它们全部分开。
因为现在所有文件都生成在与我的源代码相同的文件夹中。
(我对 C 和编译应用程序非常熟悉。如果我遗漏了一些明显的东西,我很抱歉。)
之后我可以编写一个批处理来移动文件,但如果可以在生成期间完成,我会发现它更干净。
ruby - 如何将其他构建系统与 rubygems 一起使用?
由于. _ mkmf
出于这个原因,我想使用另一个构建系统。
rubygems
构建 C 扩展需要什么?如何将autotools
/之类的构建系统集成configure
到工作流程中?
c - 使用 rb_require 和 rb_protect 在 C 中嵌入 Ruby
我想将 rb_require 与 rb_protect 一起使用,如下例所示:
但是当我编译它时,我得到了这个错误:
在 Google 上搜索以查看如何将 rb_require 与 rb_protect 一起使用后,我尝试了:
或者
但我总是得到同样的错误。当我启动它时,此错误不会停止编译,而是二进制段错误,而在没有 rb_protect 的情况下一切正常。
__编辑__
我的源文件中有错误。事实上,我测试过的所有解决方案都运行良好:
或者
或者
谢谢
c - rb_class_new_instance 引发“ArgumentError:错误类型” - 为什么?
从我的 Ruby C 扩展中,我想Geom::Vector3d
从 Google SketchUp Ruby API 创建一个新实例:https ://developers.google.com/sketchup/docs/ourdoc/vector3d
我最初的代码是这样的:
然而,这引发了一个错误:
相反,我不得不调用 rubynew
方法——就像这样:
我在Geom::Point3d和Sketchup::Color上遇到了同样的问题。
rb_class_new_instance
是在 Ruby C 中创建新实例的首选方法,对吧?有人知道我为什么需要打电话new
吗?SketchUp 中类的定义方式有些奇怪?
c - 如何在 Ruby 扩展中对 VALUE* 数组进行标记?
我有一个矩阵类型,它包含一个void*
数组,代表一个对象数组(它们都是给定矩阵中的一种类型,例如,所有 C 整数、所有浮点数、双精度数、各种结构,甚至可能所有 Ruby VALUE
) .
在我尝试创建VALUE
s 矩阵之前,内存分配和垃圾收集似乎正常工作。
我定义了以下标记函数:
VALUE
所以它只在它实际上是一个矩阵时才做标记——否则,NULL
被传递给Data_Wrap_Struct
标记函数。
但是当我测试一些VALUE
矩阵函数时,我遇到了一个段错误(参见要点)。
VALUE*
具体来说,当我第一次尝试在数组中的第一个对象上调用 Ruby 方法时,它似乎出现了段错误:
nm_id_mult
是在我的Init
函数中定义为的全局变量rb_intern("*")
。
这可能不是垃圾收集问题,但 GC 是我了解最少的 Ruby 部分——而且我的段错误也几乎与此 trace相同,poster 将其归因于 GC。
所以,我的问题:
如果是 GC,那么标记 s 数组的合适方法是
VALUE
什么?如果不是 GC,我该如何诊断这种类型的错误?我从来没有见过这样的东西。
编辑:
事实证明,这是一个VALUE
在 C 中创建的初始化 s失败的例子。
换句话说,请务必*(VALUE*)a = INT2FIX(0)
在尝试访问a
.
我仍然认为这个问题是相关的。在 StackOverflow 或其他地方,我还没有找到任何真正好的标记用于清洁和清除垃圾收集的示例。如果您可以提供这样的示例和/或解释,我会将其标记为该问题的正确答案。
ruby - 在开发带有 C 扩展的 rubygem 时,如何使用 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/ 下。除非我应该在开发过程中手动完成?
c - 在 C API 中使用 ruby 的 BigDecimal
为了从 Ruby 扩展中的 C 字符串创建 BigDecimal,我这样做:
有没有更短的方法来做到这一点?
另外,愚蠢的问题,但是否有 C API(ruby 1.9.3)的“官方”文档,或者它只是归结为阅读标题?