æ¡å¼µã©ã¤ãã©ãªãã¥ã¼ããªã¢ã«ããã£ã¦ã¿ã#1
ãªããlibyamlを移植するãã¨ã«ãªã£ããããã®ã§ï¼ã¡ãã£ã¨ãã£ã¦ã¿ãï¼
åèï¼Ruby拡張ライブラリ作成チュートリアル
ãHello, worldãã表示ããããã«
å¦çå 容ãè¨è¿°ãããã¡ã¤ã«
ã¾ãã©ã¤ãã©ãªæ¬ä½ï¼å¦çå 容ã C è¨èªã§è¨è¿°ãããã¡ã¤ã«ï¼
- hello.c
#include <stdio.h> void hello() { printf("Hello, world!\n"); }
C 㨠Ruby ãç¹ããã¡ã¤ã«
次ã«ï¼ã©ã¤ãã©ãªãå¼åºå®è¡ã§ããããã«ããï¼Ruby ã®ã¢ã¸ã¥ã¼ã«ãä½æããããã® C è¨èªã§è¨è¿°ãããã¡ã¤ã«ï¼
- test1.c
#include "ruby.h" void hello(); VALUE wrap_hello(self) VALUE self; { hello(); return Qnil; } void Init_test() { VALUE module; module = rb_define_module("Test"); rb_define_module_function(module, "hello", wrap_hello, 0); }
ãã㧠ruby.h ã«ã¯ç¹ãããã®ä»çµã¿ãªã©ãè¨è¿°ããã¦ããããããï¼ãã®æ®µéã§ã¯ã¾ã è¦ã¦ãªãï¼VALUE ã¯æ§é ä½ã§ï¼Ruby ã®ãªãã¸ã§ã¯ããä¿åã§ããï¼
å¦çã®æµã
- Rubyã test ã©ã¤ãã©ãªãèªã¿è¾¼ã
require 'test'
- Init_test ãå®è¡ãã
- rb_define_module 㧠Test ã¢ã¸ã¥ã¼ã«ãç»é²ããï¼æ»ãå¤ã¯ VALUE åæ§é ä½ï¼
VALUE rb_define_module(const char *name);
- rb_define_module_function 㧠module(ã¤ã¾ã Test ã¢ã¸ã¥ã¼ã«)ã« hello ã¡ã½ãããç»é²ããï¼wrap_hello ã¯é¢æ°ãã¤ã³ã¿ã§ï¼å¼æ°ã®æ°ã¯ 0 åï¼self ã¨ãã VALUE åæ§é ä½ã第ä¸å¼æ°ã¨ãã¦æ¸¡ããããããï¼
void rb_define_module_function(VALUE module, const char *name, VALUE (*func)(), int argc);
ã³ã³ãã¤ã«ããããããã«
Makefile ãä½æããããã«ï¼extconf.rb ãä½æãã¾ãï¼
- extconf.rb
require 'mkmf' create_makefile('test')
ãªããä¾åé¢ä¿ãè¦ã¦ãã¡ã¤ã«ãçæãã¦ããããã ãã©ï¼ã¨ãããããã¾ããªãã¨ãã¦è¦ãã¦ããï¼
ã³ã³ãã¤ã«ãã¦å®è¡ãã
- make
% ruby extconf.rb % make % ruby -r'test' -e'Test.hello' Hello, world!
ç¹ã«å¤ãå¼ã渡ããªãã®ã§ããã°ï¼ãã£ã¨ã§ããæãï¼