1.如何在Window系统安装Luarocks(踩坑篇)
2.lua文件的破破解二进制文件如何转换成源代码
3.IntelliJ IDEA Lua调试以及使用教程
4.Lua的编译和反编译
5.Lua5.4 源码剖析——虚拟机2 之 闭包与UpValue
6.大佬带你深入浅出Lua虚拟机
如何在Window系统安装Luarocks(踩坑篇)
了解Luarocks,Lua的为源软件包管理器,为Lua编程语言用户提供了安装和管理模块的破破解便捷方式。Luarocks相当于Python的为源pip,允许用户从中央存储库、破破解本地文件或URL安装Lua模块。为源skier 游戏源码模块集成为Lua扩展,破破解增强其功能。为源Luarocks还能协助管理模块间的破破解依赖关系,确保所有必需模块自动安装。为源
若要安装Luarocks,破破解首先需准备安装包和第三方工具。为源推荐使用Mingw作为编译环境,破破解避免安装错误版本导致的为源编译问题。下载Mingw后,破破解解压并放置在个人偏好位置,将可执行文件添加至环境变量中。通过命令行运行gcc --version,确认环境配置成功。
接着,下载Lua源码并解压,新建build.cmd文件,输入编译指令。双击执行,待编译完成,即可在build文件夹中找到Lua执行文件。
下载Luarocks源码并解压,使用提供的编译指令在命令行中执行。配置环境变量后,便能轻松安装Lua的第三方库。
安装第三方Lua库时,可能遇到编译问题,如找不到md5对比工具,需要安装OpenSSL解决。在命令行输入lua命令后,可能会遇到找不到.dll文件的activiti提交任务源码情况,可通过以下两种方法解决,确保顺利使用第三方库。
Luarocks简化了Lua开发者的软件包管理,提供了一种高效、便捷的方式扩展Lua功能,助力开发者更轻松地开发Lua应用程序。
lua文件的二进制文件如何转换成源代码
转换方法有使用luac命令、使用lua2c工具、使用反编译工具等。
1、使用luac命令:luac是Lua编译器,能将Lua程序编译成二进制文件,这些二进制文件可以被加载和执行。
2、使用lua2c工具:lua2c是一个工具,可以将Lua源代码转换为C源代码。这个工具是用Lua编写的,无需额外的构建、安装。
3、使用反编译工具:有些工具可以将Lua字节码反编译成Lua源代码,包括LuaDec、unluac和Ljd等。
IntelliJ IDEA Lua调试以及使用教程
为了提升开发效率和 Lua 代码调试的便捷性,IntelliJ IDEA 集成了 EmmyLua 插件。安装步骤如下:
1. 在 IntelliJ IDEA 的设置中搜索并安装 Emmylua 插件。
2. 通过 Run/Debugger 配置,添加 Emmy Debugger 类型,设置自己的 package.path。
3. 遇到如端口冲突的常见问题时,直接参考错误提示解决。
通过 IntelliJ IDEA,用户可以轻松生成 Lua API,得到 Unity 智能提示,实现代码自动生成和优化。会员功能源码IDEA 还能辅助反编译 jar 包源码,帮助开发者理解复杂代码结构。遇到内存溢出问题时,调整 IDEA 的 VM 设置参数是关键。
对于 IntelliJ IDEA 的离线安装,如需安装 lombok 插件,首先下载对应版本的离线文件,然后在 IntelliJ IDEA 设置中选择“安装插件来自磁盘”。确保下载的插件与当前 IDEA 版本匹配,以避免安装失败或 IDEA 无法启动的情况。
Lua的编译和反编译
无论是Unity项目还是Unreal的项目,我通常会使用Lua进行编程。在项目打包阶段,Lua的编译和反编译是不可或缺的步骤。在本文中,我们将探讨如何对Lua代码进行编译与反编译,以及如何利用不同的工具进行操作。
对于Lua代码的编译,我们通常有两种方法。一种是使用lua脚本直接运行代码,另一种是使用Lua的编译器(如Luac)将源代码转换为Lua字节码。通过使用指令`lua ./TestLua.lua`,我们可以测试代码的正确性。Luac是将Lua源代码编译为Lua字节码的工具,编译成功后,我们可以通过运行编译后的字节码来验证结果,一切顺利。
另一种流行的Lua编译器是Luajit,它在Unity项目中被广泛使用。使用Luajit可以提升执行速度。如果遇到编译错误,只需确保将`luajit\src\src\jit`文件放在`luajit.exe`的同一目录下的`lua`文件夹中即可。通过直接运行包含测试代码的Lua文件,我们可以确认编译和运行的流程是正确的。
在对比了两种编译方法后,灰色项目源码出售我们发现它们都有各自的特点和适用场景。Luac适用于简单的脚本或对代码优化要求不高的情况,而Luajit则更适合需要高性能的项目,特别是那些对运行速度有较高要求的场景。
对于Lua的反编译,最常用的工具是`luadec`。通过将`luadec`工具与Visual Studio项目进行集成,我们能够对编译后的字节码进行反编译,恢复源代码。在尝试反编译后,我们得到了清晰可读的代码,即使在不使用调试信息的情况下,反编译结果也具有一定的可读性。
对于更复杂的反编译需求,如支持位字节码的反编译,我们遇到了一些挑战。目前,有一个名为`ljd`的工具支持位字节码的反编译,但仅限于位平台。对于位平台的字节码,我们可能需要自行修改`ljd`的Python代码来支持,这是一个需要时间和专业知识的额外工作。尽管如此,对于大部分应用场景,上述工具已经足够满足我们的需求。
总之,Lua的编译和反编译是Lua项目开发过程中的重要环节。通过选择合适的编译工具和反编译方法,可以有效提升代码的执行效率和调试效率。同时,对于反编译过程,我们应根据实际需求选择合适的工具,并注意其适用的平台和特性。
Lua5.4 源码剖析——虚拟机2 之 闭包与UpValue
故事将由我们拥有了一段 Lua 代码开始,我们先用 Lua 语言写一段简单的枚举易语言源码打印一加一计算结果的 Lua 代码,并把代码保存在 luatest.lua 文件中:
可执行的一个 Lua 文件或者一份单独的文本形式 Lua 代码,在 Lua 源码中叫做 "Chunk"。无论我们通过什么形式去执行,或者用什么编辑器去执行,最终为了先载入这段 Lua 的 Chunk 到内存中,无外乎会归结到以下两种方式:1)Lua 文件的载入:require 函数 或 loadfile 函数;2)Lua 文本代码块的载入:load 函数;这两种方式最终都会来到下面源码《lparse.c》luaY_parser 函数。该函数是解析器的入口函数,负责完成代码解析工作,最终会创建并返回一个 Lua 闭包(LClosure),见下图的红框部分:
另外,上图中间有一行代码最终会调用到 statement 函数,statement 函数是 Chunk 解析的核心函数,它会一个一个字符地处理我们编写的 Lua 代码,完成词法分析和语法分析工作,想要了解字符处理整个状态流程的可以自行研读该部分源码,见源码《lparse.c》statement 函数部分代码:
完成了解析工作之后,luaY_parser 函数会把解析的所有成果放到 Lua 闭包(LClosure)对象之中,这些存储的内容能保证后续执行器能正常执行 Lua 闭包对应的代码。
Lua 闭包由 Proto(也叫函数原型)与 UpValue(也叫上值)构成,见源码《lobject.h》LClosure 定义,我们下面将进行详细的讲解:
UpValue 是 Lua 闭包数据相关的,在 Lua 的函数调用中,根据数据的作用范围可以把数据分为两种类型:1)内部数据:函数内部自己定义的数据,或者通过函数参数的形式传入的数据(在 Lua 中通过参数传入的数据本质上也是先赋值给一个局部变量);2)外部数据:在函数的更外层进行定义,脱离了该函数后仍然有效的数据;外部数据在我们的 Lua 闭包中就是 UpValue,也叫上值。
既然 Lua 支持函数嵌套,也知道了 UpValue 本质就是上层函数的内部数据。那么 UpValue 有必要存储于 Lua 闭包(LClosure)结构体当中吗?是为了性能考虑而做的一层指针引用缓存吗?回答:并不是基于性能的考虑,因为在实际的 Lua 运用场景中,函数嵌套的层数通常来说不会太多,个别函数多一层的查询访问判断不会带来过多的性能开销。需要在闭包当中存储 UpValue 主要原因是因为内存。Lua 作为一门精致小巧的脚本语言,设计初衷不希望占用过多的系统内存,它会尽量及时地清理内存中用不到的对象。在嵌套函数中,内层函数如果仍然有被引用处于有效状态,而外层函数已经没有被引用了已经无效了,此时 Lua 支持在保留内层函数的情况下,对外层函数进行清除,从而可以清理掉外层函数引用的非当前函数 UpValue 用途以外的大量数据内存。
尽管外层函数被清除了,Lua 仍然可以保持内层函数用到的 UpValue 值的有效性。UpValue 如何能继续保持有效,我们在之前的基础教程《基本数据类型 之 Function》里面学习过,主要是因为 UpValue 有 open 与 close 两种状态,当外层函数被清除的时候,UpValue 会有一个由 open 状态切换到 close 状态的过程,会对数据进行一定的处理,感兴趣的同学可以回到前面复习一下。
UpValue 有效性例子
接下来我们举一个代码例子与一个图例,表现一下 UpValue 在退出外层函数后仍然生效的情况,看一下可以做什么样的功能需求,加深一下印象,请看代码与注释:
上述代码在执行 OutFunc 函数后,外层的 globalFunc 函数变量完成了赋值,每次对它进行调用,都将可以对它引用的 UpValue 值即 outUpValue 变量进行正常加 1。
函数的内部数据属于函数自身的内容,外部其它函数无法通过直接的方式访问其它函数的内部数据。函数自身的东西会存在于 LClosure 结构体的 Proto*p 字段中。Proto 全称 "Function Prototypes",通常也可以叫做 "函数原型",我们来看一下它的定义,见源码《lobject.h》Proto 结构体:
结构体字段比较多,我们先不细看,后面用到哪个字段会再进行补充说明。函数的内部数据分为常量与变量(即函数局部变量),分别对应上图的如下字段:
1)常量:TValue* k 为指针指向常量数组;int sizek 为函数内部定义的常量个数,也即常量数组 k 的元素个数。
2)局部变量:LocVar* locvars 为指针指向局部变量数组;int sizelocvars 为函数定义的局部变量个数,也即局部变量数组 locvars 的元素个数。
UpValue 的描述信息会存储在 Proto 结构体中的 Upvaldesc* upvalues 字段,解析器解析 Lua 代码的时候会生成这个 UpValue 描述信息,并用于生成指令,而执行器运行的时候可以通过该描述信息方便快速地构建出真正的 UpValue 数组。
至此,我们知道了函数拥有 UpValue,有常量,有局部变量。外部数据 UpValue 也讲完,内部数据也讲完。接下来,我们开始学习函数运行的逻辑指令相关内容。
函数逻辑指令存储于函数原型 Proto 结构体中,这些函数逻辑是由一行行的 Lua 代码构成的,代码会被解析器翻译成 Lua 虚拟机能识别的指令,我们把这些指令称为 "OpCode",也叫 "操作码"。Proto 结构体存储 OpCode 使用的是下图中红框部分字段,见源码《lobject.h》Proto 结构体:
至此,我们可以简单提前说一下 Lua 虚拟机的功能了,本质上来看,Lua 虚拟机的工作,就是为当前函数(或者当前一段 OpCode 数组)准备好数据,然后有序执行 OpCode 指令。
对 OpCode 有了一定的认识了,接下来我们要补充一个 OpCode 相关的 Lua 闭包相关的内容,就是 Lua 闭包的运行环境。
一个 Lua 文件在载入的时候会先创建出一个最顶层(Top level)的 Lua 闭包,该闭包默认带有一个 UpValue,这个 UpValue 的变量名为 "_ENV",它指向 Lua 虚拟机的全局变量表,即_G 表,可以理解为_G 表即为当前 Lua 文件中代码的运行环境 (env)。事实上,每一个 Lua 闭包它们第一个 UpValue 值都是_ENV。
ENV 的定义在我们之前提到的解析器相关函数 mainfunc 中,见源码《lparser.c》:
如果想要设置这个载入后的初始运行环境不使用默认的 _G 表,除了直接在该文件代码中重新赋值_ENV 变量这种粗暴且不推荐的方式以外,通常是通过我们前面提到的加载 Lua 文件函数或加载 Lua 字符串代码函数传入 env 参数(Table 类型),就可以用自定义的 Table 作为当前 Lua 闭包的全局变量环境了,env 参数为上面两个函数的最末尾一个参数,'[' 与 ']' 字符中的内容表示参数可选,函数的定义摘自 Lua5.4 官网文档:
所以我们可以在 Lua 代码通过 _ENV 访问当前环境:
在 Lua 的旧版本中,变量的查询最多会分为 3 步:1)先从函数局部变量中进行查找;2)找不到的话就从 UpValue 中查找;3)还找不到就从全局环境默认 _G 表查找。而在 Lua5.4 中,把 UpValue 与全局 _G 表的查询统一为 UpValue 查询,并把一些操作判断提前到了解析器解析阶段进行,例如函数内部使用的某个 UpVaue 变量在代码解析的时候就可以通过 UpValue 描述信息知道存储于 Lua 闭包 upvals 数组的哪个下标位置,在执行器运行的时候只需要直接在数组拿取对应下标的这个 UpValue 数据即可。
从 OpCode 的层面来看,Lua 除了支持通过一个 UpValue 数组下标访问一个 UpValue 变量,在把 _G 表合并到 UpValue 之后,Lua 为此实现了通过一个字符串 key 值从某个 Table 类型的 UpValue 中查询变量的操作。
至此,我们了解了 Lua 闭包的结构与运行环境,以及 OpCode 的基本概念。接下来,我们将深入学习 OpCode,掌握 OpCode 就掌握了整个 Lua 虚拟机数据与逻辑的流向。
大佬带你深入浅出Lua虚拟机
本文将深入浅出地介绍Lua虚拟机的执行流程,词法语法分析以及指令集转换。首先,Lua的执行流程包括程序员编码Lua文件、语法词法分析生成Lua字节码文件、Lua虚拟机解析并执行字节码文件,最终输出结果。本文的重点在于浅出,因为我们希望用简单易懂的方式介绍Lua虚拟机的复杂内部机制。
在词法语法分析阶段,程序员的代码被分解为一系列有意义的词,每个词都有其特定的类型和含义。例如,`if`被识别为条件判断的关键字,`a`和`b`被视为变量,`<`为比较运算符,`then`和`end`分别为操作符和结束标记。通过这种分词和解析过程,计算机能够理解程序员意图。
对于条件语句`if a < b then a = c end`,我们需要将其转换为计算机可以理解的数据结构。在本示例中,我们将`if`语句抽象为`If condition(条件表达式) then dosth(语句块) end`。这一步骤类似于构建抽象语法树的过程,帮助计算机理解程序的逻辑结构。
接下来,词法语法分析的结果被转化为Lua虚拟机可以执行的指令集。以`if a < b then a = c end`为例,这将被转换为一系列具体指令,包括比较操作、赋值操作和结束指令。Lua虚拟机通过执行这些指令,实现程序的功能。
为了深入理解Lua虚拟机的执行细节,本文详细介绍了Lua5.1指令集的结构和功能。Lua指令集由位组成的指令码构成,包含多种基本操作,如加载常量、进行算术运算、条件判断等。通过指令集,Lua虚拟机能够高效执行Lua代码。
本文还提供了对Lua字节码文件结构的解释,说明Lua编译器生成的字节码文件包含文件头、顶层函数和其他函数的结构。通过解析这些字节码,可以实现对Lua程序的深入理解和优化。
最后,文章介绍了Lua虚拟机的执行过程,包括如何解析指令集、执行指令并输出结果。通过对比Lua与C程序的执行效率,分析了Lua虚拟机在寄存器访问速度、指令集平台、数据结构处理等方面的局限性。
本文旨在为对Lua虚拟机感兴趣的读者提供一个全面、易于理解的入门指南。为了进一步学习和实践Lua虚拟机的内部机制,推荐阅读Lua虚拟机的源代码。本文提供的Demo源代码展示了Lua虚拟机执行流程的一个实例,帮助读者直观理解Lua虚拟机的工作原理。
感谢所有耐心阅读本文的读者,希望本文能激发您对Lua虚拟机的深入探索和学习热情。
LuaJIT源码分析(一)搭建调试环境
LuaJIT,这个以高效著称的lua即时编译器(JIT),因其源码资料稀缺,促使我们不得不自建环境进行深入学习。分析源码的第一步,就是搭建一个可用于调试的环境,但即使是这个初始步骤,能找到的指导也相当有限,反映出LuaJIT的编译过程复杂性。
首先,从官方git仓库开始,通过命令`git clone /luabuilds/å»ä¸è½½ä½ æ³è¦çé£ä¸ªçæ¬ãä¸è½½ä¸æ¥åæ éå®è£ ï¼ç´æ¥é ç¯å¢åéã
4ãæå¼luaæ件使ç¨ä¸è¬çææ¬ç¼è¾å·¥å ·å°±å¯ä»¥æå¼åç¼è¾äºï¼linuxä¸ä½¿ç¨èªå¸¦çvimç¼è¾å¨ï¼windowsä¸ä½¿ç¨èªå¸¦çè®°äºæ¬å°±å¯ä»¥ã使ç¨è¦ä½¿ç¨luaæ件ï¼å¿ é¡»è¦å®è£ ä¸ä¸ªluaç解æå¨ã
5ãè¿æ¯luaèæ¬è¯è¨ç¼å¶çï¼å¯ä»¥ä¸è½½luaforwindowsè¿ä¸ªè½¯ä»¶ç¶åç¨ç¨åºæå¼è¿ä¸ª.luaæ件ã
6ãè¿ä¸ªå¾ç®å~~è¦çLuaå·ï¼æ¯1çè¯ï¼é£ä½ å¯ä»¥ä¸Luadecæ¥åç¼è¯ãä»å¹¶æ²¡æå å¯ï¼é£æ¯Luaåèç ç¨luacå å¯è¿äºï¼å¯ä»¥dofileçæ ¼å¼è°ç¨è¿è¡ï¼ç¶åä¿®æ¹æ°å¼ä¿åæ¿æ¢ã
luaèæ¬è¢«luacç¼è¯ä¹å,å¦ä½åç¼è¯æè åæ±æ åçluaæâCFLuaDCâå·¥å ·å¯ä»¥åç¼è¯ãæ åçlua5æâDisLuaâãâluadecâä¸¤ä¸ªå·¥å ·å¯ä¾éç¨ãï¼ï¼ï¼ä»¥ä¸ä¸ä¸ªå·¥å ·å¨ç½ä¸å¯æç´¢ä¸è½½ãluajitç¼è¯çluacæ件å°æ åç¼è¯å·¥å ·ã
è·è¸ªï¼è±å£³ï¼è§£å ï¼è§£å¯ï¼è·å¾luac追luaL_loadbufferluaL_loadfilelua_loadåºè¯¥å¯ä»¥æ¾å°è§£å¯å½æ°ãhookè¿3个å½æ°ï¼å¯¼åºè§£å¯åçæ°æ®ï¼ç´æ¥å°±æ¯luacæ件ãå¦æ没ç¼è¯çè³æ¯luaæºæ件ã
对äºä½¿ç¨åççluaæçæçèæ¬ï¼é½æç¸åºçåç¼è¯å¨ï¼ä½ è±ç¹å夫æç´¢ï¼ç½ä¸ä¸å®è½æ¾å°çã
å ·ä½æå¼æ¥éª¤å¦ä¸ï¼æä»¶æ ¼å¼åç¼å以*.luaæ ¼å¼åå¨ãç¶åæ们å¨æ¡é¢å®è£ 并åå»æå¼æ¥çå·¥å ·ãç¶åæ们æå¼æ¥çå·¥å ·ç¹å»æ件éæ©æå¼ãç¶åæ们éæ©luaæ件ç¹å»æå¼ãç¶åæ们æå¼åæ¥çæ件å 容ï¼å¹¶å¯ä»¥ç¼è¾ã
è¿ä¸ªå¾ç®å~~è¦çLuaå·ï¼æ¯1çè¯ï¼é£ä½ å¯ä»¥ä¸Luadecæ¥åç¼è¯ãä»å¹¶æ²¡æå å¯ï¼é£æ¯Luaåèç ç¨luacå å¯è¿äºï¼å¯ä»¥dofileçæ ¼å¼è°ç¨è¿è¡ï¼ç¶åä¿®æ¹æ°å¼ä¿åæ¿æ¢ã
lua5.1åluadec0.6è¿è¡é®é¢1ãè¿ä¸ªå¾ç®å~~è¦çLuaå·ï¼æ¯1çè¯ï¼é£ä½ å¯ä»¥ä¸Luadecæ¥åç¼è¯ãä»å¹¶æ²¡æå å¯ï¼é£æ¯Luaåèç ç¨luacå å¯è¿äºï¼å¯ä»¥dofileçæ ¼å¼è°ç¨è¿è¡ï¼ç¶åä¿®æ¹æ°å¼ä¿åæ¿æ¢ã
2ãæ¯çï¼è¿åºè¯¥æ¯å·²ç»ç¼è¯è¿çLUAç¨åºï¼æ¯äºè¿å¶ä»£ç ï¼ä¸æ¯ææ¬ï¼æ以æå¼ä¹åæ¯ä¹±ç ãé¤éä½ æ¾åä½è 请æ±ä»æä¾æºä»£ç ï¼ä¸ç¶åºæ¬ä¸æ 解ã
3ãè¿ä¸ªæ¯baseç¼ç è¿çï¼base解ç ä¸ä¸å°±å¥½äºã
luacèæ¬æä¹ç¼è¾æå¼å¶ä½1ãå¨å°åä¸æå³é®ï¼éæ©éæµè§ç¸å ³å ååºåå°ãæå¼éå åæµè§å¨å°ï¼å¨çªå£ä¸æ¹å°±æ¯è¯¥å°åæå¨çå åæ°å¼ï¼å ¶å®çå åæ°å¼ä¹å¨è¿éãåå»å°±å¯ä»¥ç¼è¾ãå¯æ¯ä¿®æ¹å没ææ示ï¼ä¸å©äºæ¥çã
2ã第ä¸æ¥ï¼æ°å»ºèæ¬ï¼è¿å ¥èæ¬ç¼è¾å¨ç¹å»ä¸æ¹å·¥å ·æ çæ°å»ºæé®ï¼å°±å¯ä»¥æ°å»ºä¸ä¸ªèæ¬ã
3ãåéè¡¨æ ¼å¼ï¼æ¯è¾çµæ´»çèæ¬ç±»åï¼éç¨èå´å¹¿ï¼è¿éæä¹åäºä¸ä¸ªç®åçæ ·å¼ä½ä¸ºåèãæä¸åçç»é¢éè¦å±ç¤ºçå 容ï¼æç §å§æ åå±ä¾æ¬¡æå好ï¼å¹¶ä¸æ³¨ææ¯ä¸ªç»é¢çç»èã
4ãè¿è¡æé®ç²¾çµãå¨ä¸»çé¢ä¸ç¹éâæ°å»ºâè¿å ¥èæ¬ç¼è¾å¨çé¢å·¦è¾¹çå½ä»¤ç±»åééæ©é¼ æ å½ä»¤ã常ç¨çå°±æ¯å2个ãå设游æä¸äººç©ä¸ºä¸å¿åæ ï¼ãææ¯æ¬¡éåæªç©åéç¹éè§è²èªå·±ã
5ãæé®ç²¾çµï¼æé®ç²¾çµæ¯ä¸æ¬¾æ¨¡æé¼ æ é®çå¨ä½ç软件ãéè¿å¶ä½èæ¬ï¼å¯ä»¥è®©æé®ç²¾çµä»£æ¿åæï¼èªå¨æ§è¡ä¸ç³»åé¼ æ é®çå¨ä½ãæé®ç²¾çµç®åæç¨ï¼ä¸éè¦ä»»ä½ç¼ç¨ç¥è¯å°±å¯ä»¥ä½åºåè½å¼ºå¤§çèæ¬ã
luaappæä¹ä¸è½½luaå®ç½ãstandæ¯æ¬¾ååçé¨ç大éæ游ææ¹ç¼ç§»æ¤èæ¥ççåå°å»ç±»æ游ï¼è¯¥æ¸¸æä¸çluaéè¦å»luaå®ç½ä¸è½½ï¼å®è£ ä¹åå¦æçµèæ¡é¢çå¿«æ·é®ä¸è½æå¼ï¼å°±å»æ ¹ç®å½æ¾å°.exeå¯æ§è¡æ件å³å¯æå¼ã
Gtaå°å©æuaèæ¬ï¼ä½ å¯ä»¥å¨3DM游æç½ä¸ä¸è½½ï¼æè æ¯ç´æ¥æ游æçä¸ä¸è½½ï¼æå¨ç¾åº¦ä¸æç´¢ï¼æ¾å¨æçç¾åº¦ç½çä¸ï¼ä¹å¯ä»¥ä¸è½½luaèæ¬ã
ç½ç«ä¸è½½LUAå httpï¼//ï¼ctrl+F2è¾å ¥gnome-terminalæå¼ç»ç«¯ä¸è½½ubuntuçç¼è¯æ¯æsudoapt-getinstallbuild-essential注æï¼è¿éä¸ä» ä» æ¯å®è£ gccèå·²ï¼è¿å æ¬å¾å¤å ¶ä»å·¥å ·ã
é¦å è¦ä»â设置âéé¢ï¼æWiFiï¼æ 线å±åç½ï¼å ³æãç¶åå¼å¯ç§»å¨äºèç½âï¼è®©ææºè¿è¡ç§»å¨ç½ç»ï¼ç¶ååæå¼âAPPâæ¾åºæ¥èªå·±æ³è¦æ´æ°ç软件ã
luaæ件éè¦éè¿ç¬¬ä¸æ¹è½¯ä»¶æå¼ï¼å å°ç½ç«ä¸è½½ä¸ä¸ªGGæ件ï¼ä¸è½½åå®è£ 两个çæ¬ï¼ç¡¬ä»¶å éï¼è½¯ä»¶å éï¼ç¶åç¡®å®ææºå·²ç»è¢«rootï¼å¹¶è·å¾GGæéãå®æéå è¿ç¨åï¼ç¹å»æç´¢ï¼ç¶åä¾æ¬¡ç¹å»ä¸è§ç¬¦å·ã