我有很多C++代碼,其中包含很多名稱空間中的函數和類(例如boost)。
現在我試圖嵌入LuaJiT2作爲腳本引擎,但我找不到任何有關調用函數和使用其他命名空間的東西。
那麼,是否有可能通過FFI將函數從C++名稱空間傳遞給LuaJIT?是否可以使用luajit ffi的C++名稱空間中的函數?
4
A
回答
8
您可以使用標準的Lua API向Lua公開名稱空間範圍函數以及類靜態函數。這與正常的Lua解釋器完全相同,因爲LuaJIT與其兼容。
但是您不能使用FFI,因爲FFI基於基於C的頭文件解析。你正在使用C++語法。 FFI不是只有使用LuaJIT的方式;它只是一個基於C.
任何使用Lua(Luabind,SWIG等)的特定於C++的綁定API都可以在LuaJIT中正常工作。
2
有可能使用不同的名字改編其他比C之所以它不是「共同」是因爲C++名稱重整是很不具體的編譯器/平臺: http://lua-users.org/lists/lua-l/2011-07/msg00502.html
所以這種聲明是有效的:
ffi.cdef[[
void Test1_Method1(void) asm("_ZN5Test17Method1Ev");
]]
然後你可以調用Test1_Method1。 Mike Pall在luajit上做了一件了不起的工作。很多很棒的功能。
相關問題
- 1. 在LuaJIT FFI錯誤消息中使用結構體名稱
- 2. 是否可以使用不帶類的名稱空間
- 3. 如何使用LuaJIT和FFI將clib函數合併到表中?
- 4. 是否可以在@ nrwl/nx中更改命名空間名稱?
- 5. LuaJIT ffi:如何將字符串數組傳遞給c函數
- 6. 名稱空間中的函數
- 7. LuaJIT FFI有多難?
- 8. 使用其他名稱空間內的名稱空間的函數
- 9. JavaScript:是否可以獲取當前名稱空間的內容?
- 10. 是否可以轉發聲明名稱空間內的typedef?
- 11. 我可以用jQuery contentWindow調用名稱空間函數嗎?
- 12. 是否可以在Visual Studio UML中放置名稱空間?
- 13. 名稱空間是否是分層的?
- 14. 當使用xPath時,是否可以忽略c#中的命名空間?
- 15. 愛2D和ffi luajit,試圖使用PHYSFS_enumerateFiles()
- 16. LuaJIT&FFI:如何正確使用char *?
- 17. 使用匿名。匿名的名稱空間函數。命名空間範圍
- 18. luajit FFI構造函數的參數路由
- 19. Racket/C FFI中的可變組合函數FFI
- 20. 是否可以動態定義函數參數的名稱?
- 21. 是否可以將函數名稱等同於另一個函數名稱?
- 22. 是否使用名稱空間導致名稱隱藏?
- 23. 使用名稱空間語句的C++
- 24. 使用名稱空間中的參數聲明函數
- 25. 是否可以更改JavaScript函數的`prototype`屬性的名稱?
- 26. 是否可以使用python中的函數清空字符串?
- 27. Luajit ffi如何在time.h中調用funcitons?
- 28. C#中的名稱空間和子名稱空間#
- 29. 在c#中使用名稱空間#
- 30. 在C++中使用名稱空間?
我假設你需要通過extern「C」將它們導出爲C風格的裝飾,但是我懷疑你能夠獲得類方法/模板或非導出名稱空間函數的任何東西 – Necrolis
將提升Lua可能也不是一個好主意。根據您的實際使用情況,您最好公開一個功能有限的API。 – jsimmons
謝謝@jsimmons,但boost是一個例子,「基於你的實際用例的功能有限的API」比增強庫的功能要大得多。 –