关闭

读Ruby for Rails的思考之Ruby的C扩展库

644人阅读 评论(0) 收藏 举报
Ruby除了用Ruby写的扩展库以外,还有许多C写的扩展库,比如socket编程库/系统日志功能库/数据库驱动 
这些库以.so或者.dll结尾,这也是我们require的时候不要使用.rb后缀的原因,比如 
Java代码  收藏代码
  1. require 'gdbm'  


Ruby开源项目、扩展库站点: 
Ruby Application Archive(RAA) 
RubyForge 

怎样写Ruby的C扩展库呢? 
我们来看看How to create a Ruby extension in C under 5 minutes 
该程序的前提是需要在linux/unix环境下 
MyTest/extconf.rb 
Java代码  收藏代码
  1. # Loads mkmf which is used to make makefiles for Ruby extensions  
  2. require 'mkmf'  
  3.   
  4. # Give it a name  
  5. extension_name = 'mytest'  
  6.   
  7. # The destination  
  8. dir_config(extension_name)  
  9.   
  10. # Do the work  
  11. create_makefile(extension_name)  

MyTest/MyTest.c 
Java代码  收藏代码
  1. // Include the Ruby headers and goodies  
  2. #include "ruby.h"  
  3.   
  4. // Defining a space for information and references about the module to be stored internally  
  5. VALUE MyTest = Qnil;  
  6.   
  7. // Prototype for the initialization method - Ruby calls this, not you  
  8. void Init_mytest();  
  9.   
  10. // Prototype for our method 'test1' - methods are prefixed by 'method_' here  
  11. VALUE method_test1(VALUE self);  
  12.   
  13. // The initialization method for this module  
  14. void Init_mytest() {  
  15.     MyTest = rb_define_module("MyTest");  
  16.     rb_define_method(MyTest, "test1", method_test1, 0);   
  17. }  
  18.   
  19. // Our 'test1' method.. it simply returns a value of '10' for now.  
  20. VALUE method_test1(VALUE self) {  
  21.     int x = 10;  
  22.     return INT2NUM(x);  
  23. }  

就这么简单,我们进入MyTest目录,运行 
Java代码  收藏代码
  1. ruby extconf.rb  

这会为我们创建Makefile,然后我们运行 
Java代码  收藏代码
  1. make  

这样我们的C扩展库就compile和build好了,让我们运行mytest.rb测试一下: 
Java代码  收藏代码
  1. # Load in the extension (on OS X this loads ./MyTest/mytest.bundle - unsure about Linux, possibly mytest.so)  
  2. require 'MyTest/mytest'  
  3.   
  4. # MyTest is now a module, so we need to include it  
  5. include MyTest  
  6.   
  7. # Call and print the result from the test1 method  
  8. puts test1  
  9.   
  10. # => 10  

该demo程序下载地址:extension-code.tar.gz
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:285323次
    • 积分:3271
    • 等级:
    • 排名:第10797名
    • 原创:4篇
    • 转载:264篇
    • 译文:1篇
    • 评论:22条
    最新评论