创建独立的Lua可执行文件
有没有一种简单的方法可以从 Lua 脚本创建独立的 .exe 文件?基本上这将涉及将 Lua 解释器与脚本链接起来。
我相信这是可能的(PLT Scheme 允许以同样的方式创建独立的可执行文件),但具体来说应该怎么做呢?
原文链接 https://stackoverflow.com/questions/194520
请查看 srlua,它能满足你的需求。
这是 Lua 作者之一创建的。在这个网址上还有预编译的 Windows 二进制文件,所以我想那会更容易些。
为了从脚本中创建可执行文件,可以使用 bin2c
工具,步骤如下:
luac script.lua -o script.luac
bin2c script.luac > code.c
然后在文本编辑器中创建 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
用于 GUI 可执行文件的选项为 /SUBSYSTEM:WINDOWS。 对于第一次来说,这并不容易,您可以创建批处理文件以自动化此过程一旦您成功尝试它。
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;
}
由于这个话题有些“持久”的兴趣,而可能的答案也是“流动的”,意味着新的解决方案可能会出现(而旧的解决方案可能已经过时),这里提供了另一个可能性(适用于 Windows)和纯 Lua 源代码依赖。
链接:Windows 控制台实用程序,可以一步将带有其 Lua 源代码依赖项的 Lua 源代码转换为准备编译的 C 文件。
注:除非在其他平台的字节代码中存在差异,否则产生的 C 代码应该能够在任何可以编译股票 Lua 源代码的平台上编译,并为您的 Lua 应用程序创建独立的本机二进制文件。
截至2018年,luastatic是一款正在积极维护的工具,可以将Lua代码静态编译成一个独立的可执行文件。而本问题中被接受的回答中提到的srlua和这个页面上的其他工具似乎未被维护。
下面是一个简单的方法:
- 从http://luabinaries.sourceforge.net/下载lua的二进制文件。
- 解压该文件并在同一个文件夹中创建一个app.lua文件。
- 通过WIN键加R打开运行,输入iexpress。
- 在iexpress中选择创建新的自解压指令文件并按下一步。
- 选择提取文件并运行安装命令,然后按下一步。
- 给你的应用程序取一个名字。选择不提示并且不显示许可证,然后在让你选择文件的时候选择你的app.lua和那些lua二进制文件所在的文件夹。
- 全选并按下一步,在安装程序中输入"lua54.exe app.lua"(不带引号)。在显示窗口中选择默认,完成信息中选择无消息。在包名称和选项中,点击浏览并输入你的exe名称,然后选择隐藏提取进度并使用长文件名存储文件。
- 选择不重新启动,然后你可以保存sed文件或不保存。
- 选择下一步和下一步,它应该生成一个exe,你可以双击运行这个应用程序。
- 缺点:人们可以通过将文件重命名为.zip来轻松找到你的源代码。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
- 如何创建一个 lua 脚本以针对特定键为 fluentbit 进行限流
- 如何在Lua中将变量从Lua推送到C ++
由于您说的是“.exe”,我将假设您正在寻找Windows解决方案。一个想法是将脚本附加到预先构建的解释器可执行文件上。它可能符合您的“易于”的标准,也可能不符合。
解释器需要能够读取自身,解析其标头以确定常规.exe数据的结束位置(即脚本开始的位置),然后将文件的其余部分交给Lua。
其他解决方案不需要解释器工作得那么努力,但要求更复杂的链接,而采用这种方法,将脚本转化为exe可以像这样简单:
copy interpreter.exe+script.lua script.exe