Я пытаюсь создать расширение Ruby C, которое использует некоторые библиотеки C ++. Проблема в том, что я даже не могу заставить работать простой мир.
//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 ++. Руби мой язык. Я собрал несколько тысяч строк C ++ под Рис без проблем, но так как я хочу, чтобы это конкретное расширение компилировалось под Windows, Rice не вариант.
Это потому что функция обратного вызова вы представляете 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
Вот.
Других решений пока нет …