ruby 外部使用 C function


Ruby extension, 就是用 C 或 C++ 做出能讓
Ruby 使用的程式。那麼通常會有兩種作法,一種就是真的照做 Ruby extension 的方式,你會需要 Ruby 的 header, 

在你的程式寫 #include "ruby.h" 然後用他的方法定義能讓 ruby 呼叫的程式

,最後做出一個 shared library, 可能在 windows上就是 .dll 吧!

這種作法門檻比較高,如果沒有效率考量,或是不需要跟 ruby 做這麼緊密的連結的話,我不建議用這種方式。

另外 ruby 是用 c 寫成的,你要用 c++ 的話可能會比較麻煩。

可以參考這個 gem: http://rice.rubyforge.org/這會幫你包裝好一些 c++ <=> ruby 間的轉換。

如果你只需要簡單的功能,或是說簡單的介面,那我比較推薦 ffi, 


1.安裝方法 


gem install ffi
2.安裝好之後做個DEMO

C code部分: mylib.c

// clang -shared mylib.c -o libmylib.so
int plus(int x, int y){ return x + y; }

用你的方法 compile 成 shared library

接著 ruby code : ruby.rb 則是




  

require 'ffi'

    module MyLib
      extend FFI::Library
      ffi_lib './libmylib.so'
      attach_function :plus, [:int ,:int], :int
    end

這邊我們告訴 ffi 要去讀 ./libmylib.so 這個 shared library,

然後把 MyLib.plus 這個 method直接對應到 libmylib.so 裡面的plus function.

 要把各個參數的 type 和 return type 都寫出來。

接著就能透過 MyLib.plus(1, 2) 去呼叫 c 裡面的 plus function,

ffi 會自動把 c 的 3 轉換成 Ruby 的 3 (Fixnum)要呼叫 c 的 function, 這應該是最簡單的方式了。

應該不能使用 c++,你真的要用 c++ 也只能再多做個 c 的介面了。

出處參考
https://github.com/godfat/sandbox/tree/master/mix/ffi
http://www.ptt.cc/bbs/Ruby/M.1323633722.A.2DA.html

留言