将所有内容保存在单个lua字节码块中?

Joh*_*ohn 14 embed lua bytecode

我已将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)?

Mic*_*man 11

您可以使用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
Run Code Online (Sandbox Code Playgroud)

您可以使用C将此文件加载到Lua中,luaL_loadfile如果成功加载,则会将函数放在堆栈顶部.然后你可以运行这个函数lua_call来运行所有组合的编译文件.

请注意,您可以将编译文件的内容作为字符串嵌入到项目中,而无需将其保存在外部文件中.

LuaJIT 2的更新

如您所见,您可以使用Lua中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))
Run Code Online (Sandbox Code Playgroud)

对于上一个示例,您可以按如下方式使用它:

$ luajit combine.lua l1.lua l2.lua l3.lua > out.ljc
$ luajit out.ljc
1   2
Run Code Online (Sandbox Code Playgroud)