Lua呼叫只有標頭檔案的C 動態庫函式

2021-06-26 08:39:04 字數 1708 閱讀 5997

前段時間公司讓我尋找乙個for c++的lua binder庫,要求c++ 和 lua能夠雙向呼叫(所以swig/tolua排除),最後選擇了luabind的乙個fork,名叫luaponte,選擇的原因是既有luabind的廣泛使用比較可靠,又支援luajit(我們要用)的5.1語法。

昨天做summary presentation時我用這個例子展示lua調c++的效果

void print_hello(int number) 

int main()

沒想到被人challenge了,說print_hello函式是自己定義的,實際專案中很可能不知道函式的定義,這時你怎麼保證還能呼叫?

當時沒反應過來,我選的luaponte也被architect槍斃掉了。。。。。。

今天仔細了解了下lua調c的方法,總結起來就是

1,假設你的庫里有n個函式,庫名lib***.so,則必須提供乙個函式

2,在luaopen_***裡呼叫lual_register註冊你的所有n個函式

3,其中每個函式都必須是lua_cfunction型別

4,每個lua_cfunction獲取lua通過棧傳入的引數,計算後將結果通過棧傳回lua

網上給的很多lua_cfunction示例,基本都是這樣

int myadd(lua_state *l)

但是這樣很難自動化,如果只能這樣則swig就不可能存在了,所以,我猜測上面的**如果要自動生成的話,應該是這樣的

int myadd(lua_state *l)

這樣就將負責bind的myadd和負責運算的trueadd分離開來。

其實這個trueadd完全可以放在第三方庫里,由luaponte(或其他binder庫)根據trueadd的簽名(標頭檔案)生成myadd,然後主程式鏈結myadd,myadd又鏈結trueadd。

估計swig也是這麼個路子,只是swig要額外產生乙個so,相比之下該方法更好。

最後上乙個自己寫的例子

test.cpp

#include extern int myadd(int a, int b);//all from third party lib's header file

int main()

libtest.cpp

int myadd(int a, int b)

makefile

all:

g++ -fpic -c libtest.cpp -o libtest.o

g++ -shared -o libtest.so libtest.o -ldl

g++ -std=c++11 -c test.cpp -o test.o -i/root/pkgs/luaponte-master/

g++ -o test -l/usr/local/lib -l/root/pkgs/luaponte-master/build/src/ -l. test.o -ltest -lluaponte -llua

clean:

rm -f *.o *.so test

注意:若執行報找不到libtest.so,一般是ld_library_path沒有加入當前目錄,加入即可。

Lua指令碼呼叫C 動態庫

前言 又是n久沒上來了,也沒什麼新鮮話想說。反正最近是被杭州的房價憋得抑鬱,但是也是只能對自己說要 蛋腚 今天又被這個lua呼叫dll給抑鬱了一把,還好網上搜來搜去,終於搜到一位 有識之士 的帖子,幫我搞定了這個 憋屈 的問題。最近很懶,懶得寫東西。lua呼叫c的dll的例子網上也不是很多,其實要說...

uefi只有標頭檔案和庫的用法

inf檔案中需要 buildoptions 塊 buildoptions x64 dlink flags libpath workspace testlib library dlink flags efimylib.lib export initializedriver image entry po...

lua指令碼呼叫C 動態庫中的函式

這兩天讀到的乙個開源 裡面用了c 和lua的混合呼叫,感覺比較犀利,確實用指令碼語言可以將c 編譯好的功能進行很多的擴充套件.於是也想自己試一下,不過想法略有些不同,開源專案中用到的是c 中初始化好整個程式的流程,然後在過程中將控制權交給lua指令碼去處理,我想直接寫乙個lua指令碼,用lua來執行...