从零开始的Lua宅[1]:编译Lua解释器
Lua是一门神奇的脚本语言,游戏宅必备,懒人必备。Lua差多不是学起来用起来最简单的语言了,以至于简单到自身就是文档,自身就是配置文件。但是Lua的运行效率却是众多脚本中非常高的,据说仅次于V8爹下的js。主要原因是它是主要和c/c++打交道嵌入式脚本,c++的逻辑写的着实蛋疼的时候可以考虑下这门脚本语言。
Lua有直接的windows安装包的,还内置了一个编辑器很不错。但是为了更深层次的理解Lua,本文主要介绍下如何利用Lua源码来自己编译解释器。
首先我们去下载一下Lua的本体...
百度输入:Lua官网
戳第一个进去。找到唯一认识的单词Download。
戳进去在SourceCode文件夹下抓一个lua-5.x.x.tar.gz下载。
乍一看这好像是Linux系统下的压缩文件,不过我们有万能的winrar,管他能不能用先解压再说。
解压后获得Lua的资源文件夹。先进入doc文件夹把一个叫logo的图片文件收藏,然后心中默念 Lua大法好。
进入src文件夹,这200多k的c代码就是Lua的本体了,没错就这么点。依靠这些本体我们可以在windows环境下做出三样东西:
一个Lua的静态库 .lib
一个Lua的解释器 Lua.exe
一个Lua的编译器 Luac.exe
静态库一般还需要搭配几个这个src中的头文件使用,可以瞬间嵌入到c/c++程序中让脚本成为程序的一部分(毕竟大家都是c嘛)。通过解释器可以直接执行脚本,这个用过python的一定都非常熟悉,随便写一个xx.py 然后在终端输入 python xx.py就可以执行Python脚本,Lua解释器同理,编译好后配置环境变量,然后就可以在终端执行Lua xx.lua来快捷执行Lua脚本文件。但是这么做毕竟是一边解释一边执行,所以Lua还提供了Luac编译器,可以直接将Lua脚本编译成二进制可执行文件,好了这大概就是这三个工具的主要作用了。自己动手丰衣足食,虽然Lua也有Python那样的傻瓜安装包,但是自己编译出来的才是亲儿子不是嘛哈哈,接下来我们就来编译这三个。
先说下我的环境:
操作系统 : Windows 7
工具 : VisualStudio 2013 / Lua源代码
1.静态库:打开VisualStudio,新建一个win32空项目,名字为Lua53,项目类型为静态库。取消勾选预编译头。在源文件中添加src文件夹下的所有文件,然后移除lua.c 和 luac.c这两个文件,右键项目->生成。
然后跟踪到项目的文件夹。这个时候在Debug目录下应该就有我们编译好的Lua53.lib库了。
2.解释器:新建一个win32空项目,项目类型为控制台应用程序,名字为Lua,取消预编译头,在源文件中添加src文件夹下的lua.c。
右键项目生成。肯定会失败的,不过不要紧,目的是生成Debug文件夹,进入项目的Debug文件夹,在其中创建两个文件夹,一个名叫win7,另一个叫lua53
把win7项目所需要的所有静态库装到win7文件夹里边,一般win7库文件的坐标是C:\Program Files\Microsoft SDKs\Windows\v7.1A\Lib 把里边的.lib全拷过来
lua53文件夹中,装入刚才编译好的静态库Lua53.lib
右键项目->属性->链接器->常规->附加库目录,添加两个项目所需要的静态库路径,就是刚才我们创建的两个位于Debug文件夹下的路径。
右键项目->属性->链接器->输入->附加依赖项,添加一项 Lua53.lib
大功告成后右键项目生成,不出意外Debug文件夹下就会有一个Lua.exe可执行文件了。
将这个Debug文件夹的路径添加到系统变量的Path当中,启动powershell 输入 Lua 应该就可以进入Lua环境了。同时也可以写一个xx.lua 然后执行Lua xx.lua来执行这个脚本。
3.编译器:步骤和上边完全一样,可以勾选预编译头。源文件中添加的是src文件夹下的luac.c。在Windows要这个编译器没什么卵用,因为编译的是.out的二进制可执行文件QAQ。
注:上述的Debug目录就可以当成一个最终产品移植到别的windows机器上,因为静态库都已经傻瓜似的自带了,其实用不了那么多的.lib懒得挑了因为这都不是重点。但即便如此如果对方没有安装vs2013依旧执行不了,因为还缺少一个动态库MSVCR120.dll(我能怎么办我也很绝望啊)。 这需要机器安装Microsoft Visual C++ 2013 Redistributable Package。因为我们的都是win32项目,对应安装32位版本就好。
https://github.com/RockDeria/LuaFile.git
再注:关于Lua语法方面的学习,书籍的话当然推荐经典的《Lua程序设计》(黄皮肤红眼睛),网上的话菜鸟教程也很不错。
从零开始的Lua宅[1]:编译Lua解释器的更多相关文章
- 用VC编译lua源码,生成lua语言的解释器和编译器
用VC编译lua源码,生成lua语言的解释器和编译器 1.去网址下载源码 http://www.lua.org/download.html 2.装一个VC++,我用的是VC6.0 3.接下来我们开始编 ...
- windows下编译lua源码
所有的lua源码都放在了 src 文件夹下,当然,不同的lua版本目录结构有可能不一样,但是都会有 src 这个文件夹,只有这个才是我们编译必须的.而且lua越做越精简了,5.1的版本里面还有一些te ...
- <转>windows下编译lua源码
因为之前一直使用 lua for windows 来搭建lua的使用环境,但是最新的 lua for windows 还没有lua5.2,我又想用这个版本的lua,所以被逼无奈只能自己编一下lua源码 ...
- 编译lua
http://www.lua.org/ 新建一个 static library 工程,把解压得到的目录下的src子目录中的所有.h和.c文件拷贝到新工程目录下. 工程中删除自动生成的 main.c 文 ...
- 在Windows和MacOS下编译Lua
官方说明: http://www.lua.org/manual/5.3/readme.html 在Windows下编译Lua动态链接库的注意事项: 1. 创建一个空的DLL项目: 2. 将src文件夹 ...
- Lua源码编译之CL编译器编译
通过使用VC下的CL编译器,可方便地编译Lua源码,而无需构造工程并设置各种选项: 以下以源码Lua5.3.1版本为例,将通过CL编译选项直接编译源码,为方便编译将采用批处理脚本,脚本放置在Lua解压 ...
- Sublime Text(2/3)编译lua
想在subLime text 3中集成编译Lua(或其他语言)功能,只需要在Tool->Build System -> New Build System中将原来的 { "shel ...
- [lua]安卓ndk如何编译lua库
这里说的lua库是标准lua库,不包含tolua,不包含cocos2dx的各种lua扩展,是干净的lua. 参考: http://stackoverflow.com/questions/1229965 ...
- Lua 5.2 编译 For Windows
body { font-family: 微软雅黑; font-size: 11pt; line-height: 1.5; } html, body { color: #000000; backgrou ...
随机推荐
- Windows窗体间的数据交互
轻松掌握Windows窗体间的数据交互 作者:郑佐 2004-04-05 Windows 窗体是用于 Microsoft Win ...
- François Hollande’s&…
EVER since President François Hollande was elected last May, things have not gone right for him. He ...
- day1 java基础回顾- Properties类与配置文件
Properties配置文件说明 Properties类对应.properties文件.文件内容是键值对,键值对之间使用"="或空格隔开.开头是"#"的表示注释 ...
- 如何升级一个JavaWeb应用
准备db变更 准备整个war包或变更的文件 上传文件至云盘(通常直接上传文件较慢,建议先传到云盘,然后下载) 从云盘下载 执行db变更 解压war到指定目录或替换变更的文件 修改设计IP地址的配置文 ...
- ubuntu18.04安装opencv 3.4.1
github 地址: https://github.com/opencv/opencv 安装依赖 sudo apt-get install build-essential sudo apt--dev ...
- PHP中GD库是做什么用的? PHP GD库介绍11111111
什么是gd库? gd库是php处理图形的扩展库,gd库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片. 在网站上GD库通常用来生成缩略图或者用来对图片加水印或者对网站数据 ...
- 萌新笔记之Nim取石子游戏
以下笔记摘自计算机丛书组合数学,机械工业出版社. Nim取石子游戏 Nim(来自德语Nimm!,意为拿取)取石子游戏. 前言: 哇咔咔,让我们来追寻娱乐数学的组合数学起源! 游戏内容: 有两个玩家面对 ...
- 平衡的阵容 st表学习
模板 预处理 void rmq_isit() { ;i<=n;i++) mx[i][]=mn[i][]=a[i]; ;(<<j)<=n;j++) ;i+(<<j)- ...
- python爬虫——web前端基础(2)
图像标记------->>>> <img>图像标记,用来在网页中显示图像.使用方法为:<img src="路径/文件名.图片格式" wi ...
- Java8 中的 Optional
从 Java 8 引入的一个很有趣的特性是 Optional 类.Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都 ...