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
留言
張貼留言