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

标签 lua embed 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)?
  • 最佳答案

    您可以使用 将多个文件合并为一个文件。 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获得一个可以像前面提到的那样加载的组合文件。这是一个简化版本,输出到标准输出:
    -- 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
    

    关于lua - 将所有内容保存在单个 lua 字节码 block 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9580366/

    相关文章:

    video - 如何在推文中嵌入视频?

    java - 现在在 Java 中进行静态分派(dispatch)、字节码生成代理的最佳方法是什么?

    documentation - LLVM IR 操作码文档

    string - 在Lua中,我可以在没有自定义函数的情况下轻松选择第N个结果吗?

    luasql 零值

    sql - 当 Dbh 查询在 FreeSWITCH 中返回零行时,如何在 Lua 脚本中匹配 "-ERR no reply"?

    javascript - d3 嵌入图像显示两次

    html - 创建可点击的嵌入标签

    Javassist 报告字段在构造函数中初始化后为空

    recursion - Lua在递归函数中声明局部变量