2013-10-26 38 views
7

在我的應用程序中,我有從C後端公開的所有Lua庫。現在,我需要加載一個Lua模塊。這種方法似乎是:將LuaJIT模塊嵌入到C應用程序中

lua_getglobal(L, "require"); 
lua_pushstring(L, libname); 
lua_pcall(L, 1, 0, 0); 

這將搜索package.path找到<libname>.lua並加載它。

是否可以將內置將Lua模塊插入到C應用程序中(以便模塊成爲C應用程序的一部分)?這樣我就不必單獨打包Lua模塊。不知何故,我無法找到任何參考或例子! :(

PS我使用LuaJIT-2.0.2,並且所討論的庫是SciLua/Time(使用ffi

+2

[由C運行luajit目標文件]中可能重複(http://stackoverflow.com/questions/19416981/running-luajit-object-file-from-c) –

回答

6

是。

luajit -b Module.lua Module_bc.c 

將編譯的模塊的字節碼和輸出含有一個C數組初始化字節碼 如果您在啓用共享庫的情況下構建並從主可執行文件導出此陣列,require會發現它(並且不需要查找Module.lua。)

要測試它正在工作,請在模塊的require之前設置package.path = ""。如果它仍然有效,那麼您知道預加載正在工作,它不僅僅使用當前目錄中的Module.lua文件。

http://luajit.org/running.html

其他的事情要記住:

  • 如果模塊依賴於(使用io.open)外部文件,該文件仍然需要存在。例如,某些ffi模塊嘗試打開C頭文件,以傳遞至ffi.cdef
  • 您需要保持Module_bc.cModule.lua(例如,用Makefile配方,否則你會看到一些令人困惑的錯誤!
+0

我的想法,我看見Mike提到的另一篇文章也是如此。但在我的應用程序中,我不打算使用任何共享庫。所以,我的理解是,我需要'luajit'生成的BC數組,我需要執行'package.preload',但是我不希望腳本調用require,所以我還需要做lua_getglobal(L,「require」); lua_pushliteral(L,「模塊」)'在Lua狀態。正確? – vyom

+0

如果您不希望腳本調用require,那麼您還需要將模塊對象存儲在全局表中。也許可以使用'luaL_loadbuffer'而不是'require'。並且從'luajit -b'生成'.h'文件而不是'.c'文件,因爲'.h'版本包含一個長度字段,但'.c'版本不包含(您需要的長度爲傳遞給'luaL_loadbuffer'。) – finnw