编译lua代码,存储字节码,然后加载和执行它。

我正在尝试编译一个调用一些导出函数的lua脚本,将结果字节代码保存到一个文件中,然后加载该字节代码并执行它,但是我没有找到任何如何做到这一点的示例。是否有可用的示例来完成这个操作?我该如何做?编辑:我使用Lua + Luabind(C ++)。

原文链接 https://stackoverflow.com/questions/8936369

点赞
stackoverflow用户734069
stackoverflow用户734069

这是非常简单的。

首先,你需要将 Lua 脚本加载到 lua_State 中但并不需要执行。是否连接了 Lua 状态与输出函数没有关系;你所做的只是编译脚本文件。

你可以使用 luaL_loadfile,它使用 C 标准库函数从硬盘中读取文件并将其加载到 lua_State 中。或者,你可以将文件本身载入字符串并使用 luaL_loadstring 将其加载到 lua_State 中。

这两个函数将根据文档中 lua_load 的标准发出返回值和编译错误。

如果编译成功,lua_State 现在在栈顶拥有编译后的 Lua 代码块作为 Lua 函数。要获取编译后的二进制代码,你必须使用 lua_dump 函数。因为它使用回调接口来传递数据,所以它相当复杂。阅读文档以了解更多信息。

经过这个过程,你就有了编译后的 Lua 字节码。将其推入你选择的文件中。只需记住:将其作为 二进制 编写,而不是文本转换。

当要加载字节码时,你所需做的只是... _与之前完全一样_。好吧,几乎一样。Lua具有检测“字符串”是否是Lua源字符串或字节码的启发式方法。因此,你可以像以前一样使用 luaL_loadfile 加载字节码。

不同之处在于无法使用 luaL_loadstring 加载字节码。该函数需要一个以 NULL 结尾的字符串。这是不好的。字节码中可能包含嵌入的 NULL 字符,这会导致一切混乱。因此,如果你想自行完成文件 IO(因为你正在使用特定的文件系统或其他原因),你必须直接使用 lua_load(或者 luaL_loadbuffer)。它也使用像 lua_dump 一样的回调接口。请阅读如何使用它的信息

2012-01-20 04:41:15