问题标签 [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 - 如何在 Windows 中使用 ruby 扩展库(在 c 中)运行我的 ruby 应用程序?
我将感谢您对此的任何帮助:我想为我的 c 库编写一个扩展。我创建了使用库 libzmq(用 C++ 编写)的文件 zmq.cpp。
我使用 ruby extconf.rb 创建了 makefile,然后运行 nmake。一切顺利。Nmake 生成的文件
这一切都是在 Windows XP 中完成的。
然后我有一个测试程序,在我的第一行有:
当我尝试使用运行我的测试程序时
我明白了
文件位置是正确的,我检查了它。
你知道如何运行它吗?
注意:我在 ubuntu 中完成了所有这些工作,它运行良好 - 我创建了 makefile,并且能够使用与此处类似的命令运行测试应用程序(只有路径不同)。
谢谢
c - (U) Ruby 扩展:rb_gc_mark() 和实例变量
我正在编写一个定义类的 ruby 扩展。如果我Data_Wrap_Struct()
用来实现我的回调rb_define_alloc_func()
,我是否需要手动标记和释放实例变量?或者这仍然为我处理?
c++ - 如何使 rdoc 从我的 c 扩展中正确读取方法参数?
总之,我正在使用 rdoc 为包含 C 扩展的 Ruby 代码生成文档,但是我的方法参数有问题。Rdoc 没有正确解析它们的名称,而是使用 p1、p2 等。
因此,首先,我的扩展实际上是编译为 C++,所以我必须使用如下所示的函数定义:
看起来 rdoc 需要像这样的旧式“C”定义:
无论如何我可以完成这项工作吗?
c - 如何将 Proc 转换为 Ruby C 扩展中的块?
我在 Ruby C 扩展中存储了一个 proc 数组,我需要遍历每个 proc 和 instance_eval。问题是 instance_eval 只接受块,而不接受 procs。这不是 Ruby 中的问题,我可以简单地去:
但是我不确定如何使用 Ruby C API 来解决这个问题。
有谁知道我如何做到这一点?
c - 如何在 Ruby C API 中有效地合并两个哈希?
我正在为 Ruby 编写一个 C 扩展,它确实需要合并两个哈希,但是 rb_hash_merge() 函数在 Ruby 1.8.6 中是静态的。我尝试改用:
但这太慢了,而且性能在这个应用程序中非常关键。
有谁知道如何在考虑效率和速度的情况下执行此合并?
(请注意,我尝试简单地查看 rb_hash_merge() 的源并复制它,但它与其他静态函数相混淆,这些函数本身充满了更多静态函数,因此似乎几乎不可能解开......我需要另一种方式)
c - Ruby c 扩展:如何捕获所有异常,包括非标准错误的异常?
在红宝石中,
不会捕获不是StandardError
. 在 C 中,
会做同样的事情。我怎样才能rescue Exception => e
从 ruby C 扩展(而不仅仅是rescue => e
)?
c - Ruby 1.9.1-p378 C 扩展 rb_block_call 怪异
我正在处理应该是一个相当基本的迭代。我知道我可以使用 Ruby 代码来完成它,但我已经在使用 C 扩展,所以我更愿意将此函数与其余代码一起保存在 C 中 - 特别是因为这应该可以(以一种或另一种方式)在没有问题。
问题在于 rb_block_call。以下是 README.EXT 描述 rb_block_call 的方式:
调用 recv 上的方法,方法名称由符号 mid 指定,提供 func 作为块。func 将从 yield 作为第一个参数接收值,data2 作为第二个参数,argc/argv 作为第三/第四个参数。
所以,我的理解(通过查看 Ruby 内部验证)是接收函数应该如下所示:
在这里,我们遇到了问题。在我的用例(我将在下面包括)中, rb_yield_value 和 data2 按预期传递;另一方面,argc 始终设置为 1,argv[0] 为 rb_yield_value,argv[1] 为 false,argv[2] 为 rb_yield_value,argv[3] 抛出异常。
我为 argc 和 argv 传递了什么并不重要;传递 0 和 NULL 结果相同,1 和 VALUE 设置为 Qtrue 也是如此。带有 argc/argv 的所有内容都保持原样。
这是我正在使用的代码:
Ruby 内部似乎没有很多带有 argc/argv 的 rb_block_call 示例......最多只有一两个,我相信它们都只是在内部传递值而不是使用它们。
想法?
c - 使用单例的 Ruby C 扩展
我只想允许创建我的 C 扩展类的一个实例,所以我想包含单例模块。
据我了解,该行的作用与 相同Singleton.included(MyMouse)
,但如果我尝试调用它,我会得到
为什么它的rb_include_module
行为与我预期的不同?也赞赏任何切向的讨论/解释或相关文章。Ruby初学者在这里。
此外,我似乎可以让我的扩展尽可能简单,然后再破解某种接口以确保我只允许一个实例。或者只是将我的鼠标相关方法放入一个模块中......任何有意义吗?
c - 如何避免 Ruby 扩展中的跨线程冲突?
我正在编写一个 C 扩展,提供 Ruby 和异步 I/O 库之间的接口。在我的代码上运行测试时,我经常遇到错误,包括(但不限于):
异步 IO 意味着我的 C 扩展需要从多个线程(而不是主解释器线程)向 ruby 传递消息。在此过程中,如何避免这些线程安全违规?
c - 如何编译/创建使用 c 的 ruby 扩展?
我想创建一个使用 c 的 ruby 扩展。但是当我用 gcc 编译它时,我得到了这个错误:
我做错了吗?我的 rubyext.c 文件只有一行代码:
任何帮助是极大的赞赏。