2014-04-05 52 views
1

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

是否有可能,是否符合道德标准?

+1

也http://stackoverflow.com/questions/194520/creating-standalone-lua-executables见。 – lhf

+1

你也可以像[premake](https://github.com/annulen/premake/blob/master/scripts/embed.lua)那样在文本上做到这一点,并且如果你想要搞乱,静态混淆(即加密或压缩)字符串随着脚本更难 –

回答

1

那么,你希望把所有的Lua源到你的可执行文件,所以你需要这样的:

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

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

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

  • 自定义装载机:
    写短的Lua C函数,用于搜索该阵列,并返回load和一个字符串包围发现filecontents作为一个Lua字符串。
    将其放入package.searchers进行注册。

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

+0

对不起,我不明白你的意思。 –

+0

@Ehan:详细阐述。 – Deduplicator

+0

我想我现在有点理解了,比方说,Lua文件'test.lua'是否放在'lua'文件夹中,我会放入lua_files []'lua \ test.lua'吗?只是想澄清。 –

2

使用“embedded bytecode” LuaJIT的特点:

要静态嵌入模块的字节码在您的应用程序,生成目标文件,只是与你的应用程序联系起来。

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")