Re: [問題] 使用外部dll
我跟 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
→
12/12 16:38, , 1F
12/12 16:38, 1F
→
12/12 17:32, , 2F
12/12 17:32, 2F
→
12/12 17:32, , 3F
12/12 17:32, 3F
→
12/12 17:36, , 4F
12/12 17:36, 4F
推
04/16 15:15, , 5F
04/16 15:15, 5F
→
04/16 15:15, , 6F
04/16 15:15, 6F
→
04/16 15:16, , 7F
04/16 15:16, 7F
→
04/16 15:16, , 8F
04/16 15:16, 8F
→
04/16 15:17, , 9F
04/16 15:17, 9F
→
04/16 15:18, , 10F
04/16 15:18, 10F
討論串 (同標題文章)
Ruby 近期熱門文章
PTT數位生活區 即時熱門文章