有没有一种简单的方法从Lua脚本创建独立的.exe文件?基本上这将涉及链接Lua解释器和脚本.
我相信它是可能的(PLT Scheme允许以相同的方式创建独立的可执行文件),但究竟如何呢?
小智 9
要从脚本生成可执行文件,请使用bin2c实用程序:
luac script.lua -o script.luac
bin2c script.luac > code.c
Run Code Online (Sandbox Code Playgroud)
然后在文本编辑器文件main.c中创建并使用您喜欢的编译器编译/链接它.而已.(注意 - 可执行文件也支持命令行参数)
MSVC示例:
cl /I "./" /I "$(LUA_DIR)\include" /D "_CRT_SECURE_NO_DEPRECATE" /D "_MBCS" /GF /FD /EHsc /MD /Gy /TC /c main.c
ld /SUBSYSTEM:CONSOLE /RELEASE /ENTRY:"mainCRTStartup" /MACHINE:X86 /MANIFEST $(LUA_DIR)\lib\lua5.1.lib main.obj /out:script.exe
mt -manifest $script.manifest -outputresource:script.exe;1
Run Code Online (Sandbox Code Playgroud)
使用/ SUBSYSTEM:WINDOWS用于GUI可执行文件.所有这一切都不容易,只有第一次,您可以创建批处理文件,以便一旦您成功尝试它自动化过程.
main.c中:
#include <stdlib.h>
#include <stdio.h>
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
int main(int argc, char *argv[]) {
int i;
lua_State *L = luaL_newstate();
luaL_openlibs(L);
lua_newtable(L);
for (i = 0; i < argc; i++) {
lua_pushnumber(L, i);
lua_pushstring(L, argv[i]);
lua_rawset(L, -3);
}
lua_setglobal(L, "arg");
#include "code.c"
lua_close(L);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
小智 5
既然你说“.exe”,我就假设你正在寻找 Windows 解决方案。一种想法是将脚本附加到预构建的解释器可执行文件中。在你的书中,它可能符合也可能不符合“简单”的标准。
解释器需要能够读取自身,解析其标头以确定常规 .exe 数据结束的位置(即脚本开始的位置),然后将文件的其余部分交给 Lua。
其他解决方案不需要解释器那么努力地工作,但确实需要更多涉及的链接,而使用这种方法,执行脚本可以像
copy interpreter.exe+script.lua script.exe
Run Code Online (Sandbox Code Playgroud)