zed.0xff.me

пишем на C расширение для ruby

Это не просто, а очень просто (как два пальца об асфальт два файла написать):

1й файл: mytest.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "ruby.h"
void Init_mytest();
VALUE method_sayhello(VALUE);

VALUE mytest = Qnil;

void Init_mytest() {
  mytest = rb_define_module("MyTest");
  rb_define_method(mytest, "sayhello", method_sayhello, 0);
}

VALUE method_sayhello(VALUE self) {
  puts("Hello World!");
  return Qnil;
}

2й файл: extconf.rb

1
2
3
4
require 'mkmf'
extension_name = 'mytest'
dir_config(extension_name)
create_makefile(extension_name)

запуск:

1
2
3
4
5
6
7
8
9
10
11
12
#ruby extconf.rb 
creating Makefile
#make
x86_64-pc-linux-gnu-gcc -shared -o mytest.so mytest.o -L. -L/usr/lib64 -Wl,-R/usr/lib64 -L. -Wl,-O1 -rdynamic -Wl,-export-dynamic    -Wl,-R -Wl,/usr/lib64 -L/usr/lib64 -lruby18  -lpthread -lrt -ldl -lcrypt -lm   -lc
#irb
irb(main):001:0> require 'mytest'
=> true
irb(main):002:0> include MyTest
=> Object
irb(main):003:0> sayhello
Hello World!
=> nil

// пример содран с Введения в расширения Ruby на C, но там всё разжевывается под винду и вижуалстудию