从零开始的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 ...
随机推荐
- check_MK安装部署(nagios4版本)
概述: 操作系统版本:CentOS release 6.3 (Final) 64位 nagios版本:Nagios Core 4.0.6 pnp4nagios版本:pnp4nagios-0.6.22 ...
- Android应用如何反馈Crash报告
转自:http://www.cnblogs.com/draem0507/archive/2013/05/25/3099461.html 一.为什么要Crash crash可以理解成堕落,垮台.按照我们 ...
- Python中正则匹配使用findall时的注意事项
在使用正则搜索内容时遇到一个小坑,百度搜了一下,遇到这个坑的还不少,特此记录一下. 比如说有一个字符串 "123@qq.comaaa@163.combbb@126.comasdf111@a ...
- 02_mysql卸载和安装
如果只是随便地反安装/uninstall之后,在文件系统或者是注册表里面可能会残留一些东西,这些东西如果不及时清除掉,再装可能会出现问题,你新装的会用不了. #Path to installation ...
- day1 java基础回顾-集合
1.集合 1.1 集合的类型与各自的特性 ---|Collection: 单列集合 ---|List: 有存储顺序, 可重复 ---|ArrayList: 数组实现, 查找快, 增删慢 由于是数组实现 ...
- linux c实现的提取文件名的小程序
/*@author etangyushan *工作中很多时候会和文件名打交道,有时候只需要文件名称,就写了这么一个小程序 *这个函数实现了把一个文件的绝对路径和后缀去除,只留下文件名的功能 * */ ...
- HashMap为什么是线程不安全的
HashMap底层是一个Entry数组,当发生hash冲突的时候,hashmap是采用链表的方式来解决的,在对应的数组位置存放链表的头结点.对链表而言,新加入的节点会从头结点加入. 我们来分析一下多线 ...
- jquery、javascript实现(get、post两种方式)跨域解决方法
一.实现get方式跨域请求数据 浏览器端 <script> $(document).ready(function(){ $.ajax({ url: "http://www.xxx ...
- GTK学习笔记之Linux下Gtk环境搭建
下面介绍下Ubuntu 环境下具体的安装过程: 1.配置安装gcc/g++/gdb/make 等基本编程工具(必须装好) 刚装好的Ubuntu系统中已经有GCC了,但是这个GCC几乎什么文件都不能编译 ...
- 用 _tcscmp 替代 strcmp 或 wcscmp
转自:http://blog.csdn.net/eickandy/article/details/50081537 好处:是可以不管是用unicode 编码还是其他 ,代码都不用改. C++标准库函数 ...