将所有内容保存在一个 Lua 字节码块中?
我将Lua与一个字节码块嵌入到了用C编写的项目中。现在,当我通过添加.lua文件扩展我的lua代码库时,有没有办法将这些代码保留在一个单独的字节码块中呢?
(我知道如何加载多个字节码块。但是让其加载一个单独的块,然后忘掉粘合代码似乎会更方便。)
我尝试使用文本包含,但似乎Lua中没有关键字。 "Require"和"dofile"在运行时查看文件,因此运行"lua -b..."后,生成的字节码不会包括那些文件的代码。
而且也没有将字节码文件合并的方法,对吧?我的意思是,当创建一个字节码文件时,"require"命令会将所有这些文件的代码添加到一个字节码文件中。
PS:Michal Kottman的答案适用于Lua,这是我所问的。我认为Lua和LuaJIT的工作方式相同。但它们并不相同。要将多个.lua文件合并为一个LuaJIT字节码文件,应该使用以下方法之一:
- 使用"LuaJIT -b"(似乎不起作用)
- 使用LuaJIT源编译Lua的luac.c
- 使用lua命令模拟luac.c(没有C API)?
原文链接 https://stackoverflow.com/questions/9580366
你可以使用 luac 将多个文件合并成一个文件。运行时,这些源文件中的所有代码块将按添加到编译文件中的顺序依次执行:
$ echo "x=1" > l1.lua
$ echo "y=2" > l2.lua
$ echo "print(x, y)" > l3.lua
$ luac -o run.luac l1.lua l2.lua l3.lua
$ lua run.luac
1 2
您可以使用luaL_loadfile
从C中将此文件加载到Lua中,如果成功加载,则该函数将在堆栈顶部放置一个函数。然后,您可以使用lua_call
运行此函数以运行所有组合编译文件。
请注意,您可以将编译文件的内容作为字符串嵌入到项目中,无需将其保留为外部文件。
更新LuaJIT 2
正如您发现的那样,您可以使用Lua Compiler in Lua来获取一个组合文件,该文件可以像以前一样加载。这是一个简化版本,输出到stdout:
-- http://lua-users.org/wiki/LuaCompilerInLua
-- compile the input file(s) passed as arguments and output them combined to stdout
local chunk = {}
for _, file in ipairs(arg) do
chunk[#chunk + 1] = assert(loadfile(file))
end
if #chunk == 1 then
chunk = chunk[1]
else
-- combine multiple input files into a single chunk
for i, func in ipairs(chunk) do
chunk[i] = ("loadstring%q(...);"):format(string.dump(func))
end
chunk = assert(loadstring(table.concat(chunk)))
end
io.write(string.dump(chunk))
对于先前的示例,您可以按如下方式使用它:
$ luajit combine.lua l1.lua l2.lua l3.lua > out.ljc
$ luajit out.ljc
1 2
另一种方法是使用 Mathew Wild 的 squish 工具将所有的 Lua 源代码收集到一个单独的 .lua
文件中。Squish 的一个好处是支持各种过滤器,以帮助使压缩包比源文件的总和更小。
应用 Squish 后,可以通过 luac
将结果转换为字节码。然而,字节码通常比源代码更大,如果在 Squish 中使用更激进的过滤器(如 gzip
),则字节码几乎肯定会更大。
如果字节码文件与可执行文件分开存储(或更糟糕的是通过网络传输),我还会提出与字节码相关的安全问题,这与 Lua 源代码无关。但是,链接到应用程序的字节码要更难被破坏,因为有害的字节码永远不会是运行 luac
的结果。
经过尝试使用 luac、luajit 和 squish,我发现它们都要求你维护一个文件列表以进行合并。当处理包含许多 Lua 文件的项目时,这会很繁琐。
因此,我编写了一个小工具,通过分析 require
来合并 Lua 文件。
在这里:https://github.com/yi/node-lua-distiller
希望它能有所帮助。
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
loadstring
是你需要的函数。它接收一个字符串并加载它(在必要时将其编译为字节码)。结果是一个可以执行的函数,可以在以后运行其中包含的代码。如果你仍需要更一般的功能,可以看看
load
,它允许你指定一个函数来传递 chunks。这两个函数都可以处理 Lua 源代码和编译的字节码。