【发布时间】:2014-05-18 02:30:28
【问题描述】:
如何构建我的 C++ 项目以将所有 Lua 文件包含在一个可执行文件中?我不希望人们能够编辑 Lua 文件并改变游戏。
这可能吗,是否合乎道德?
【问题讨论】:
-
你也可以像在premake 中那样以文本方式进行操作,如果你想让脚本更难弄乱,你也可以对字符串进行静态混淆(即加密或压缩)
如何构建我的 C++ 项目以将所有 Lua 文件包含在一个可执行文件中?我不希望人们能够编辑 Lua 文件并改变游戏。
这可能吗,是否合乎道德?
【问题讨论】:
好吧,你想把所有 Lua 源代码放到你的可执行文件中,所以你需要这个:
一种将文件名映射到 Lua 文件的方法:
char lua_files[]={
"filename1\0filecontents1",
"filename2\0filecontents2",
0,
};
这可以通过在构建时读取您的 Lua 文件目录的脚本自动创建。
或者,它甚至可以预编译文件,因此您可以从嵌入的 Lua 库中删除解析器。
load 和一个包含找到的文件内容的字符串作为 Lua 字符串。package.searchers 进行注册。如果您以后希望以某种方式允许加载自定义脚本,请保留旧搜索器并确保您以某种方式需要不在您的源中的文件。
【讨论】:
test.lua 在 lua 文件夹中,我会放入 lua_files[] lua\test.lua 吗?只是想澄清一下。
lua_file = {"lua/test.lua\0require \"World\":execute()--Or Whatever your file contains.", 0}
使用 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")
【讨论】: