【问题标题】:Building Lua scripts alongside project与项目一起构建 Lua 脚本
【发布时间】:2014-05-18 02:30:28
【问题描述】:

如何构建我的 C++ 项目以将所有 Lua 文件包含在一个可执行文件中?我不希望人们能够编辑 Lua 文件并改变游戏。

这可能吗,是否合乎道德?

【问题讨论】:

标签: c++ lua


【解决方案1】:

好吧,你想把所有 Lua 源代码放到你的可执行文件中,所以你需要这个:

  • 一种将文件名映射到 Lua 文件的方法:

    char lua_files[]={
        "filename1\0filecontents1",
        "filename2\0filecontents2",
        0,
    };
    

    这可以通过在构建时读取您的 Lua 文件目录的脚本自动创建。
    或者,它甚至可以预编译文件,因此您可以从嵌入的 Lua 库中删除解析器。

  • 自定义加载器:
    编写一个简短的 Lua C 函数,它搜索数组并返回 load 和一个包含找到的文件内容的字符串作为 Lua 字符串。
    将其放入package.searchers 进行注册。

如果您以后希望以某种方式允许加载自定义脚本,请保留旧搜索器并确保您以某种方式需要不在您的源中的文件。

【讨论】:

  • 抱歉,我不太明白你的意思。
  • 我想我现在有点明白了,假设 Lua 文件 test.lualua 文件夹中,我会放入 lua_files[] lua\test.lua 吗?只是想澄清一下。
  • lua_file = {"lua/test.lua\0require \"World\":execute()--Or Whatever your file contains.", 0}
【解决方案2】:

使用 LuaJIT 的“embedded bytecode”功能:

要将模块的字节码静态嵌入到您的应用程序中,请生成一个目标文件并将其与您的应用程序链接。

require() 尝试从导出的​​符号(在 Windows 上的 *.exe 或 lua51.dll 中)和 package.cpath 中的共享库加载嵌入的字节码数据。

例子:

luajit -b test.lua test.obj                 # Generate object file
# Link test.obj with your application and load it with require("test")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    相关资源
    最近更新 更多