3

我正在尝试构建一个使用一些 c++ 库的 Ruby C 扩展。问题是我什至无法让一个简单的“hello world”工作。

//hello_world.cpp
#include <ruby.h>


static VALUE tosCore;

static VALUE my_function( VALUE self )
{
    VALUE str = rb_str_new2( "Hello World!" );
    return str;
}

extern "C"
void Init_hello_world( void )
{    
    tosCore = rb_define_module("Core");
    rb_define_module_function(tosCore, "my_method", my_function, 0);   
}

我得到的输出是

compiling hello_world.cpp
hello_world.cpp: In function 'void Init_hello_world()':
hello_world.cpp:17:67: error: invalid conversion from 'VALUE (*)(VALUE) {aka lon
g unsigned int (*)(long unsigned int)}' to 'VALUE (*)(...) {aka long unsigned in
t (*)(...)}' [-fpermissive]
In file included from c:/Ruby200/include/ruby-2.0.0/ruby.h:33:0,
                 from hello_world.cpp:2:
c:/Ruby200/include/ruby-2.0.0/ruby/ruby.h:1291:6: error:   initializing argument
 3 of 'void rb_define_module_function(VALUE, const char*, VALUE (*)(...), int)'
[-fpermissive]
make: *** [hello_world.o] Error 1

我不是 C/C++ 专家。Ruby 是我的语言。我在下面编译了几千行 C++我已经在Rice下毫无问题

4

1 回答 1

3

这是因为您呈现给的函数回调rb_define_module_function不是编译器所期望的。它想要一个看起来像这样的函数:

VALUE my_function(...)

但你的功能是

VALUE my_function( VALUE self )

请注意参数列表中的差异。

摆脱错误的一种方法是将参数类型转换为期望的类型rb_define_module_function

rb_define_module_function(tosCore, "my_method",
    reinterpret_cast<VALUE(*)(...)>(my_function), 0);

你可以在reinterpret_cast这里阅读。

于 2013-10-08T13:51:33.550 回答