前言:又是n久沒上來了,也沒什麼新鮮話想說。反正最近是被杭州的房價憋得抑鬱,但是也是只能對自己說要「蛋腚」!今天又被這個lua呼叫dll給抑鬱了一把,還好網上搜來搜去,終於搜到一位「有識之士」的帖子,幫我搞定了這個「憋屈」的問題。最近很懶,懶得寫東西。
lua呼叫c的dll的例子網上也不是很多,其實要說很多的話,**是大部分的形式,有好有壞吧。轉得多了,倒是讓人看得鬱悶,因為搜了半天都是一樣的東西,甚至沒有自己想要的,好處也有,有需要的人,隨便一搜就搜到了,頓時心情不錯,對社會的「憤青」又少了幾個。因為真的很難找到,所以,我還是做做好人把東西這裡發一下,順便修修補補幾下。
先來看一段dll的cpp吧,沒啥東西,就是個demo:
//#include "luacall.h"
#define pas(l, n) (lua_tostring(l, n))
int lua_hellolua(lua_state* l)
lual_reg gtfunc =,
};extern "c" int luaopen_luacall(lua_state* l)
我再多費唇舌幾下:lua呼叫c/c++的函式有個基本規則,該函式必須要是lua_cfunction的格式(不知道自己查去,或者看例子中的lua_hellolua也行,反正就是這個格式)。幾個比較關鍵的地方就是入口函式和庫函式了(假使你寫的是個小工具庫,那麼如同lua_hellolua一樣,這個就算是個庫函式)。例子中的入口函式為luaopen_luacall,也需要是lua_cfunciton格式的,因為這個入口函式在lua呼叫的時候需要執行。另乙個就是存放庫函式的結構lual_reg結構。最後乙個關鍵的地方就是把庫函式註冊到lua環境中去,用的就是lual_register函式。這些函式的用法可以去http://www.lua.org/manual/5.1/自己查詢一下,我就不贅述了。
這裡的gtfunc是個lual_reg結構的陣列,需要以乙個雙null的結構作為結束標誌,其他的也沒啥值得注意的地方。
c和c++由於編譯不一樣,因為lua是用c寫的,所以在c++匯出函式,要用 extern "c" 修飾,下面luacall.h匯入lua的標頭檔案也一樣:
def檔案中寫上匯出函式的名字
exports
luaopen_luacall
就可以了。
下面講最抑鬱的地方,一定要注意,在windows下測試中發現的問題,我相信在linux下也差不多,不過我沒去驗證過。
lua呼叫dll的入口函式一定是要命名成luaopen_***的(這個可以參考lua.org上的文件),並且,如果使用require方式,那這個***一定要是這個dll的名稱,在lua指令碼中require時大小寫敏感。也就是說,例子中,dll檔案必須命名為luacall.dll,注意大小寫。
如果是用package.loadlib方式,那麼匯入的dll檔名可以不同。個人看來是require比較懶惰啦,呵呵。
下面是lua中呼叫的demo,這裡演示了dll檔名在package.loadlib中可以不同於匯出函式宣告:
呼叫dll有兩種方式,一種是require,一種是package.loadlib,區別是,require是預設去呼叫下入口函式的,而package.loadlib只是載入,需要你手動呼叫。
demo中,就是預設package.loadlib的形式,下面需要顯示得執行以下f(),表示呼叫載入的庫,而如果是用require的話,直接就可以從if gt_lib then這句開始了。
最後嘮叨句,如果是用lual_reg陣列的形式,那麼註冊到lua中的是乙個table,如果是單個結構,那麼就是函式,還有就是注意lua51.dll的位置,最保險就是講幾個dll和指令碼呢統統放到同乙個目錄下執行。自己動手試一下吧,呵呵。
lua指令碼呼叫C 動態庫中的函式
這兩天讀到的乙個開源 裡面用了c 和lua的混合呼叫,感覺比較犀利,確實用指令碼語言可以將c 編譯好的功能進行很多的擴充套件.於是也想自己試一下,不過想法略有些不同,開源專案中用到的是c 中初始化好整個程式的流程,然後在過程中將控制權交給lua指令碼去處理,我想直接寫乙個lua指令碼,用lua來執行...
Lua 指令碼呼叫 C 函式
上篇說到 c 程式裡呼叫lua 函式,此篇講lua 指令碼裡呼叫c 函式。lua要呼叫c 程式裡的函式,這些函式必須有同樣的原型 typedef int luafunc lua state l 結合工作上的業務來實現乙個簡單的lua 呼叫 c 函式的例子,業務是上這樣的,有一可攜式裝置向我們的裝置傳...
golang呼叫lua指令碼
import github.com aarzilli golua lua 2 呼叫lua指令碼的幾個重要函式 l lua.newstate 建立乙個lua虛擬機器 l.dofile 設定要呼叫的lua檔案 l.getfield lua.lua globalsindex,獲取lua指令碼的符號 l.c...