我正在尝试编译一个调用一些导出函数的lua脚本,将生成的字节码保存到文件然后加载这个字节码并执行它,但我还没有找到任何关于如何执行此操作的示例。有没有关于如何做到这一点的例子?我怎么能这样做?
编辑:我正在使用Lua + Luabind(C ++)
答案 0 :(得分:57)
这一切都很简单。
首先,加载Lua脚本,不用执行它。如果你已经将Lua状态与导出的函数连接起来并不重要;你正在做的就是编译脚本文件。
您可以使用luaL_loadfile
,它使用C标准库函数从磁盘读取文件并将其加载到lua_State
。或者,您可以自己将文件加载到字符串中,然后使用luaL_loadstring
将其加载到lua_State
。
这两个函数都会根据the documentation for lua_load
发出返回值和编译器错误。
如果编译成功,lua_State
现在将编译好的Lua块作为堆栈顶部的Lua函数。要获取已编译的二进制文件,必须使用lua_dump
函数。它相当复杂,因为它使用回调接口传递数据。请参阅the documentation for details。
在该过程之后,您具有已编译的Lua字节代码。将其推入您选择的文件中。请记住:将其写为 binary ,而不是文本翻译。
当需要加载字节代码时,您需要做的就是...... 正是您之前所做的。好吧,差不多。 Lua具有启发式检测,它给出的“字符串”是Lua源字符串或字节代码。所以,是的,您可以像以前一样使用luaL_loadfile
加载字节代码。
不同之处在于您不能将luaL_loadstring
与字节代码一起使用。该函数需要一个以NULL结尾的字符串,这很糟糕。字节代码可以在其中嵌入NULL字符,这会搞砸一切。因此,如果您想自己执行文件IO(因为您使用的是特殊文件系统或其他内容),则必须直接使用lua_load
。它也使用像lua_dump
这样的回调接口。所以read up on how to use it。