lua的FFI庫--alien

工程師WWW發表於2013-11-19

所謂FFI就是Foreign Function Interfaces。

    最近的一個工作,是搞一個基於lua的開發中介軟體框架,希望通過lua來粘合其他廠商提供的開發庫,最後統一開發介面。alien剛好能滿足條件,而且體積也不大,相容Windows和Unix系統。另外還有個C/Invoke,但是到2007年就沒再更新版本了。

先從http://luaforge.net/projects/alien/下載最新版的原始碼,說明文件在程式碼的doc目錄中,比較痛苦的是,文件寫的很不清楚,也沒有完整的函式說明,只有看程式碼了。

    編譯完了,生成2個動態庫:core.dll和struct.dll。怎麼把他們搞到lua中呢?它的說明文件說,最好的方法是用LuaRocks這個工具(這個所謂的最好,應該是針對alien的作者說的)。LuaRocks是個已經編譯好的Lua執行環境,提供各種外接包的管理功能,對使用lua命令列進行測試,還是很方便的。

    到http://www.luarocks.org/en下載個最新版本的LuaRocks(1.0版),直接執行裡面的install.bat,安裝到預設目錄C:\LuaRocks中。安裝完後,把C:\LuaRocks\1.0設定到環境變數PATH中。在cmd中,執行luarocks install alien,自動下載alien並且安裝。這時候多了2個東西,1、多了個rocks,這個目錄是luarocks的擴充套件庫目錄,因為只安裝了alien,因此下面只有alien目錄,進如alien目錄看看,基本跟自己下載alien相同;2、在bin目錄下多了個constants.bat,這個工具是用來轉換dll的標頭檔案中預定義變數的,用了一下,非常不智慧,不能識別#define,需要手工建立一個h檔案,對源庫的標頭檔案進行引用,並且指明哪些預定義可以轉換成lua變數,建議以後自己寫個。

    調整lua的環境變數。預設可以找到“C:\LuaRocks\1.0\lua”,如果目錄不能找到,可以嘗試增加 LUA_PATH=C:\LuaRocks\1.0\lua\?.lua;C:\LuaRocks\1.0\lua\?\init.lua;C:\LuaRocks\1.0\lua\?.lua;%LUA_PATH%和LUA_CPATH=C:\LuaRocks\1.0\?.dll;C:\LuaRocks\1.0\loadall.dll;%LUA_CPATH%。這2個環境變數將被require使用。luarocks的使用方法是,加引數執行lua5.1 -l luarocks.require,自動匯入被安裝的模組。

    測試alien是否可用。進入C:\LuaRocks\rocks\alien\0.4.1-1\tests目錄(當前路徑很重要,因為測試檔案中的程式碼以當前路徑為基準),執行lua5.1 -l luarocks.require test_alien.lua,如果螢幕沒有任何顯示,說明alien執行正常。

    alien在命令列的使用方式。先用lua5.1 -l luarocks.require啟動lua,然後require("alien")回車,require("alien.struct")回車。如果要引入一個dll(這個dll在當前目錄下),就可以直接寫dll=alien.dll的名字。呼叫dll中的方法,需要先定義這個方法物件。例如:

>def=alien.default
>def.puts:types("int", "string")
> def.puts("foo")
foo

    就是先使用default庫(這個庫可以在alien的程式碼中做修改,改成一個常用庫),然後定義定義了puts函式,函式返回值為int,引數為sting。最後呼叫puts的過程。還是很方便的。

  將alien嵌入自己的程式碼。可以先把它編譯成lib或者dll,或者乾脆嵌入原始碼,然後在自己的程式裡呼叫它的luaopen_alien_core函式初始化,就可以了。當然,需要跟lua結合使用。

相關文章