lua的FFI庫--alien
所謂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結合使用。
相關文章
- Lua FFI 實戰
- lua——alien庫實現lua呼叫C動態連結庫(dll、so)
- ele-alien-前端常用的工具庫前端
- Lua math庫
- 在Java中使用panama FFI呼叫Rust庫JavaRust
- 安裝 Lua 的 HTTP 庫HTTP
- lua-web-utils庫Web
- PHP 7.4 前瞻:FFIPHP
- 編譯lua動態庫編譯
- PHP FFI 實現listPHP
- lua的string庫與強大的模式匹配模式
- node-ffi使用指南
- LeetCode-Alien DictionaryLeetCode
- Lua_第22章 Debug 庫
- Linux下安裝PHP的lua擴充套件庫LinuxPHP套件
- lua的for的坑
- PHP通過FFI呼叫CJieba分詞PHPJieba分詞
- PHP透過FFI呼叫CJieba分詞PHPJieba分詞
- 整理下electronJs整合ffi踩得坑JS
- lua的update、lateupdate
- LUA基礎: TABLE, ARRAY, NAMESPACE, LUA的物件導向namespace物件
- Lua_第 21 章 作業系統庫作業系統
- PHP FFI呼叫go,居然比go還快PHPGo
- Redis使用lua指令碼實現庫存扣減Redis指令碼
- 使用了lua-resty-http庫進行 爬蟲RESTHTTP爬蟲
- PHP FFI詳解 - 一種全新的PHP擴充套件方式PHP套件
- Java的Panama專案與JNI以及外部函式介面FFIJava函式
- [LeetCode] 953. Verifying an Alien DictionaryLeetCode
- Lua 特性
- 《Lua-in-ConTeXt》09:學一點 LuaContext
- Lua遊戲開發(一)---Lua語言遊戲開發
- lua~IDEA中除錯lua指令碼Idea除錯指令碼
- 透過例子學習Lua(5)--Lua與C的互動(轉)
- LUA的基礎知識
- lua不同版本的位操作
- 學習Lua的意義
- Lua 與 ObjC 的互動OBJ
- 使用自定義lua解析管理器呼叫lua指令碼中的table指令碼