当我运行命令时,我很难弄清楚为什么我的 rb_define_singleton 和 rb_define_method 调用会中断
rake compile
。
首先,一个问题可能是我实际上不确定最后一个整数参数实际上代表什么,以便决定使用什么值,并且我无法找到解释这一点的文档,但所以我觉得我只是在猜测但问题似乎出在第三个参数上,所以我担心的是
其次,我的构建失败,调用
make
时出现以下错误:
make 编译../../../../ext/fftw/fftw.cpp ../../../../ext/fftw/fftw.cpp:在函数“void Init_fftw()”中: ../../../../ext/fftw/fftw.cpp:64:58:错误:无效转换 'VALUE ()(VALUE, VALUE) {又名 long unsigned int ()(long unsigned int, long unsigned int)}' 到 'VALUE ()(...) {又名 long unsigned int ()(...)}' [-fpermissive] 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.0/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”的参数 3 rb_define_singleton_method(VALUE, const char*, VALUE ()(...), int)' [-fpermissive] void rb_define_singleton_method(VALUE, const char, 值(*)(任意参数), int); ^ make: * [fftw.o] 错误 1 耙子中止!
该错误意味着我根本无法测试 ruby 中的函数,因为我需要首先成功定义此定义,因此我已将文件剥离到最少以尝试执行此操作
到目前为止,我已经尝试过多种类型的铸造,但似乎都不起作用。我开始怀疑我在 extconf 中的标志和编译器选择设置错误,但我不确定。
失败文件的源代码位于 github 上
欢迎任何建议!谢谢
ruby C api 的文档有点缺乏。关于此的唯一“官方”文档是 extension.rdoc
您的 C 函数可以具有 20 个签名之一,但由于 C 中没有重载,并且创建所有
rb_define_method
变体的 20 个版本会为您使用 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 中传递的参数数量相同)
-1 表示你的函数应该有签名
VALUE some_function(VALUE self, VALUE *argv, VALUE argc);
即您将获得一个参数数组和参数数量。这也意味着 ruby 将允许使用任意数量的参数调用该方法(即报告的数量将为 -1)。
rb_scan_args
在这种情况下通常很有用。
最后,-2 意味着你的函数看起来像
VALUE some_function(VALUE self, VALUE args);
and
args
是一个包含参数的 ruby 数组(这同样允许调用者传递任意数量的参数)。
不幸的是,类型转换意味着如果你犯了这个错误,你的代码将在运行时以某种未定义的方式崩溃,而不是编译时错误。