当前位置: 首页 > 知识库问答 >
问题:

在c(或c)中使用rb_ define_

刘松
2023-03-14

当我运行命令< code>rake compile时,我很难弄清楚为什么我的rb_define_singleton和rb_define_method调用会中断。

首先,一个问题可能是我不确定最后一个整数参数实际上代表什么,以便决定使用什么值,我无法找到解释这一点的文档,但我觉得我只是猜测在那里,但问题似乎在第3个参数中,所以我担心的是

其次,我的构建失败,在调用make时出现以下错误:

使编译../../..../../ext/fftw/fftw。cpp../../..../../ext/fftw/fftw。cpp:在函数“void Init_fftw()”中:../../../ext/fftw/fftw。cpp:64:58:错误:从“VALUE()(VALUE,VALUE){aka long unsigned int()(long unsinsigned int,long unssigned int)}”到“VALUE()(…){ako long unnigned int()(…)}”[-fppermissive]rb_define_singleton_method(cNMatrix,“r2c”,fftw_r2c,1)}的转换无效在/Users/private/.rvm/rubies/ruby-2.1.2/include/ruby-2.1.0/ruby/ruby中包含的文件中。h: 1694:0,来自/Users/private/.rvm/rubies/ruby-2.1.2/include/ruby.2.1/ruby。h: 33,从../../..../../ext/fftw/fftw。cpp:1:/Users/private/.rvm/rubies/ruby-2.1.2/include/ruby-2.1.0/ruby/intern。h: 216:6:错误:初始化'void rb_define_singleton_method(VALUE,const char*,VALUE(),int)〔-fppermissive〕的参数3,void rb_make:[fftw.o]错误1 rake中止!

这个错误意味着我根本无法在ruby中测试这些函数,因为我需要成功地完成这个定义,所以我首先将文件精简到最少来尝试这样做

到目前为止,我已经尝试了各种类型的铸造,但似乎都不管用。我开始怀疑我在extconf中设置的标志和编译器选项有误,但我不确定。

失败文件的源代码在github上

欢迎任何建议谢谢

共有1个答案

巫马越彬
2023-03-14

ruby C api的留档有点欠缺,唯一的官方留档是extension.rdoc

您的C函数可以有20个签名中的一个,但是由于C中没有重载,并且创建所有< code>rb_define_method变量的20个版本会给接口增加许多重复,所以您使用< code > RUBY _ METHOD _ FUNC(your _ function)对函数指针进行类型转换。

整数参数告诉ruby您正在使用哪个签名:

0到17表示C函数如下所示:

VALUE some_function(VALUE self, VALUE arg1, VALUE arg2); /* if you had passed 2 */

整数只是函数接受的参数的数量,不包括self(所以这也与ruby land中传递的参数数量相同)

-1表示函数应具有签名

VALUE some_function(VALUE self, VALUE *argv, VALUE argc);

i、 e.传递一个参数数组和参数数量。这也意味着ruby将允许使用任意数量的参数调用该方法(即,报告的arity为-1)<在这种情况下,code>rb_scan_args通常很有用。

最后,-2 表示您的函数看起来像

VALUE some_function(VALUE self, VALUE args);

args是一个包含您的参数的ruby数组(这同样允许调用者传递任意数量的参数)。

不幸的是,类型转换意味着如果你犯了这个错误,你的代码将会在运行时以某种未定义的方式爆炸,而不是一个编译时错误。

 类似资料:
  • 问题内容: 我正在编写一个跨平台程序。我希望这个程序可以在Windows和Linux上运行,所以对于两个平台,我有两个不同的代码段。如果操作系统是Windows,则我希望第一个代码段可以运行;如果是Linux,那么我要运行第二个代码段。 所以我写了下面的代码,但是在Windows和Linux上构建时都会出错。我该怎么解决? 问题答案: 通常是这样完成的(或多或少): 这样,只有在Linux平台上才

  • 问题内容: 每当调用某个函数时,是否有任何方法可以在C或C ++的运行进程中转储调用堆栈?我想到的是这样的: Where的工作方式与Perl 类似。 或类似这样的东西: 在其中放置某种内部断点,该断点将在每次调用时打印堆栈跟踪。 标准的C库中是否存在类似的东西? 我正在使用GCC在Linux上工作。 背景 我有一个测试运行,该行为基于一些不应影响此行为的命令行开关而有所不同。我的代码有一个伪随机数

  • 问题内容: 我想使用或在C中使用。我该怎么做?我不知道如何用C处理它们,如果有人知道,请告诉我如何。谢谢。 问题答案: 通常,最好避免打开文件以获取随机数据,因为该过程中存在多个故障点。 在最近的Linux发行版,该系统调用可用来获取加密安全随机数,它不能失败 ,如果 是 没有 指定为标志和读取量最多256个字节。 截至2017年10月,OpenBSD,Darwin和Linux(带有)现在都已实现

  • 我必须创建一个Java原生接口(JNI),以便从Android的反应原生模块访问C或C代码吗? 我的目标是在既支持Android又支持iOS的react本机模块中重用常见的C和C算法(非UI)。从目标C*调用C很简单。m模块,或目标C*中的C。mm模块。然而,Android的react本机模块用java实现本机模块代码。 https://facebook.github.io/react-nativ

  • 问题内容: 显然,有许多问题看起来像一个简单的正则表达式表达式就可以解决,但是事实证明用正则表达式 很难 解决。 那么, 不是正则表达式专家的 人怎么知道他/她是否应该学习正则表达式来解决给定的问题呢? 这似乎很好地总结了这一点: 有些人在遇到问题时会想到“我知道,我会使用 正则表达式。” 现在他们有两个问题… (我刚刚更改了问题的标题以使其更加具体,因为C#中Regex的一些问题已在Perl和J

  • 问题内容: 我想使用系统蜂鸣器(并且只有在没有蜂鸣器/无法访问蜂鸣器时才使用扬声器)生成具有特定频率和长度(针对不同的声音信号)的蜂鸣声。我知道可以通过使用ioctl来做到这一点,但这需要root访问权限,而这是我所不希望的。 我知道我可以只使用“ beep”命令,但这将是一个依赖关系,如果可能的话,不应使用它(根本没有外部依赖关系,只有基本的linux库和C)。 我目前拥有的是以下代码(但这需要