前段時間公司讓我尋找乙個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來執行...