作者godfat (godfat 真常)
看板Ruby
標題Re: [問題] 使用外部dll
時間Mon Dec 12 04:01:59 2011
我跟 windows 不是很熟,但就我所知,所有 win32api 不管是 gem 或是什麼,
都是拿來讓你呼叫 Win32 API 的,而我看不出來你這邊想呼叫什麼 Win32 API?
你想透過 Ruby 呼叫你所編譯的程式,這跟 Win32 API, 就我所知,是毫無關係的。
我想你想做的事情,似乎比較接近 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
雖然老實講我不確定 windows 上能不能用... 試試 gem install ffi
我隨手寫了一個示範:(請自行把兩行接成一個網址)
https://github.com/godfat/sandbox/tree/
8b9f74bee3db71aae9983f30b20f7dc7f45de2a2/mix/ffi
具體內容是 mylib.c:
int plus(int x, int y){ return x + y; }
用你的方法 compile 成 shared library, 我的作法是:
clang -shared mylib.c -o libmylib.so
接著 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 的介面了。
*
最後最後,給你一個誠心的建議不要用 dev-c++ 這種古董了.....
都什麼年代了還在 gcc 3.4.2 實在是.. 七年前的東西了,
GNU 五年前就沒有在維護了:
http://gcc.gnu.org/releases.html
我推薦 Code::Blocks
http://www.codeblocks.org/
這是我幾年前離開 windows 和 c++ 時在用的東西,
看起來現在運作應該還良好才是。或是你可以直接用 MinGW 也很好:
http://www.mingw.org/ 目前版本似乎是 gcc 4.5
--
Hear me exalted spirits. Hear me, be you gods or devils, ye who hold
dominion here:
I am a wizard without a home. I am a wonderer seeking refuge.
Sacrifice
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.38.235
→ godfat:還在 gcc 3.4.2, 看來作者連網站都換了嗎?還是換人更新..? 12/12 17:32
→ godfat:看起來真的是不同人,難怪網站沒辦法更新,名字應該換的 12/12 17:36
推 Naniko:C++ IDE的話,mac上推薦用xcode直接寫(雖然有人討厭xcode 04/16 15:15
→ Naniko:),unix-like的話netbeans上次感覺不錯。 04/16 15:15
→ Naniko:monodevelop上次寫c#感覺很猛,很有visual studio express 04/16 15:16
→ Naniko:整盤搬來的味道,但不知能不能拿來當cpp ide 04/16 15:16
→ Naniko:win的話就還是用VC寫吧。找不到比Visual Studio方便的IDE了 04/16 15:17
→ Naniko:用textmate.sublimeeditor之類的東西配gcc也很穩就是。 04/16 15:18