Lua 之使用 VS 生成解释器、编译器和链接库
来源:互联网 发布:操作系统调度算法代码 编辑:程序博客网 时间:2024/06/16 19:07
链接库、解释器和编译器
lua 是开源的,我们可以从官网下载源代码,其源代码是用纯 c 写的,因此如果想要在 c 项目中嵌入 lua 代码很简单,只需要把 lua 的源代码包含到 c 项目里面即可。但这肯定不是最好的方式,更好的方式是把 lua 源代码编译成链接库,要使用的时候直接包含链接库和必要的头文件即可。另外,除了在 c 或其它项目中使用 lua 之外,我们可能还要单独地执行 lua 文件,甚至直接在命令行交互式地执行 lua 语句,因此还要生成相应的 lua 解释器和 lua 编译器。
lua 解释器
编译 lua 源代码之后会生成一个 lua.exe 文件,这个文件就是 lua 解释器。解释器是一个独立的可执行程序,它能够直接执行一个 lua 源文件,比如 lua.exe hello.lua
;也能够直接执行一个 lua 语句,双击运行 lua.exe 之后会打开一个命令行窗口,在窗口中输入 print "hello world"
,可以看到屏幕上输出了 hello world,即 lua 解释器执行了这条语句。lua 是一门脚本语言,和许多脚本语言一样,lua 代码并不需要经过编译就可以直接运行,解释器的作用就是直接运行源代码。
把 lua 解释器所在的目录添加到系统环境变量,则可以在命令行中执行调用 lua 命令,命令行会通过环境变量自动找到 lua.exe 并运行它。比如我配置的环境变量
path = "...;D:\engine\lua5.3"
接下来看看如何通过 lua 源代码生成 lua 解释器,首先使用 visual studio 新建一个控制台项目,然后选择空项目
把 lua 源代码的所有头文件包含进来
把 lua 源代码除了 luac.c 之外的所有源文件包含进来
编译项目。编译成功之后就可以在 Debug 目录下看到一个 lua.exe 文件,这就是 lua 解释器,双击它可以看到打开了一个命令行窗口,在这窗口里输入 lua 语句就可以直接执行。可能你编译之后看到的文件名不是 lua.exe,这是因为你的项目名不叫 lua,而生成的文件名和项目名是一样的。解决的办法有很多,第一种直接把项目名改成 lua;第二种直接修改生成之后的文件,把文件名改成 lua.exe 即可;第三种在项目属性里修改目标文件名,原来的配置是这样的
$(ProjectName) 表示的是项目名,因此默认生成的文件名和项目是一样的,我们可以手动修改成这样
事实上,解释器的名称不一定要是 lua.exe,只不过这是一种比较规范和习惯的叫法而已;你也完全可以叫其它的名称,只是在使用的时候要记得用你自己的名称。比如你的解释器叫 luasource.exe,配置好环境变量之后,在命令行中执行一个 hello.lua 文件,则要写
luasource hello.lua
有点别扭_
lua 编译器
lua 虽然是一门解释器的脚本语言,但其实 lua 代码也是可以被编译成二进制字节码的,编译 lua 代码就需要使用到 lua 编译器 luac.exe。编译后的 lua 代码文件同样可以使用 lua 解释器来执行或者嵌入到 c 程序中,只不过它不再是源代码的格式,而是二进制文件,这可应用于代码加密。生成 lua 编译器的过程跟生成解释器的过程类似,首先新建控制台空项目
把 lua 源代码的所有头文件包含进来
把 lua 源代码除了 lua.c 之外的所有源文件包含进来
这个过程几乎和生成解释器的过程一模一样,不同的是解释器不包含 luac.c 而包含 lua.c,而编译器不包含 lua.c 而包含 luac.c。编译之后就可以在 Debug 目录下看到一个 luac.exe;和解释器一样,你生成的文件名不一定是 luac.exe。把 luac.exe 所在目录添加到环境变量,就可以直接在 cmd 中使用 luac 命令来编译 lua 代码。建议把 lua.exe 和 luac.exe 放在同个目录下,这样只需要把这个目录添加到环境变量,就可以在命令行使用编译器和解释器了。
lua 链接库
lua 解释器和编译器可以独立执行 lua 代码或编译代码,如果我们想在 c 程序中嵌入 lua 代码,则需要 lua CAPI 的支持,也就是需要把 lua 源代码包含进来;一种比较好的方式是把 lua 源代码编译成链接库,这样每次使用的时候就不需要把源代码包含进来了。windows 上链接库分为两种,静态链接库和动态链接库,具体可参见这篇文章
http://www.cnblogs.com/dongzhiquan/archive/2010/07/22/1994587.html
简单来说,就是下面几点
1. 静态链接库把所有指令都编译成 .lib 文件中。使用时要把 lib 文件和头文件包含到项目中,生成项目时地把静态链接库的所有指令链接到应用程序 exe 中去;因此应用程序会比较大,但不需要其它库的支持,单独一个 exe 文件就能执行。
2. 动态链接库把所有指令都编译到 .dll 文件中去,另外还会生成一个导入动态库的 lib 文件,这个文件只定义了 dll 中哪个指令可以使用,并不包含实际的指令内容。使用时要把 lib 文件和头文件包含到项目中,生成项目时不会把指令链接到 exe 文件中,而是在执行时动态从 dll 文件中加载,因此应用程序会比较小,但必须把 dll 文件放在可执行文件所在目录或程序能找到的系统目录。
3. lib 文件有两种,一种是静态链接库本身,它包含了所有编译后的指令,文件比较大;另一种是动态链接库的导入库,它只声明了动态库中哪些有哪些导出的指令,不包含实际内容,文件比较小。
编译 lua 静态链接库
首先,新建一个控制台项目,选择静态库,把预编译头取消
然后把 lua 源代码的头文件和源文件包含进来,不包含 luac.c 和 lua.c。编译之后在 Debug 下生成一个 lua.lib 文件,可以看到这个文件还是挺大的,我编译的 5.3 版本有 1M 多。
编译 lua 动态链接库
首先,新建一个控制台项目,选择 DLL,把预编译头取消
然后把预生成的头文件和源文件删掉,再把 lua 源代码的头文件和源文件包含进来,不包含 lua.h,lualib.h,luac.c 和 lua.c 这四个文件。
然后打开项目属性,选择 C/C++ –> 预编译头 –> 不使用预编译头
再选择 C/C++ –> 预处理器 –> 预处理定义 –> 编辑 –> 添加 LUA_BUILD_AS_DLL
然后编译,发现在 Debug 目录生成一个 lua.dll 和 lua.lib 文件,dll 文件有几百k,lib 文件只有几十k,比静态库要小很多。
使用链接库
无论是使用静态链接库还是动态链接库,都需要把相应的头文件和 lib 文件包含到项目中,头文件包括 lua.h,lua.hpp,lualib.h,luaconf.h 和 lauxlib.h 这五个。
对比一下使用静态库的应用程序和使用动态库的应用程序
第一个是使用静态链接库生成的应用程序,文件比较大,但单独的 exe 文件就可以执行,不依赖于其它库文件。
第二个是使用动态链接库生成的应用程序,文件比较小,但运行时需要找到 dll 文件。
写在最后
这篇文章总共生成下面几个文件
- lua 解释器 lua.exe
- lua 编译器 luac.exe
- lua 静态链接库 lua.lib
- lua 动态链接库和导入库 lua.dll lua.lib
最后贴一下资源管理器的目录结构
把 D://engine//lua5.3 加入到环境变量 path,就可以在命令行使用解释器和编译器;在 C 应用程序中想要嵌入 lua 代码,如果使用静态链接库的方式,则把 include 文件夹和 lib 文件包含到项目中;如果使用动态链接库的方法,则把 include 文件夹和 dll 文件夹包含到项目中。
- Lua 之使用 VS 生成解释器、编译器和链接库
- 关于使用VS生成Lua 5.2.3编译器与解释器 动态库 静态库
- 关于使用VS生成Lua 5.2.3编译器与解释器 动态库 静态库
- (1)生成Lua解释器和编译器
- Lua源码Lua编译库及解释器、编译器编译
- 编译器和解释器。
- 编译器和解释器
- 编译器和解释器
- window下编译lua源码,编译lua的库文件,编译lua解释器,编译lua编译器
- 编译器和链接器
- 编译器和链接器
- 编译lua的库和解释器
- 浅谈编译器和解释器
- 深入浅出编译器和解释器
- Java解释器和编译器
- visual studio编译器和链接器使用的环境变量
- 关于编译器和链接器
- 编辑器、编译器和链接器
- POJ-2377--Bad Cowtractors---最大生成树
- bzoj 2843: 极地旅行社
- Error:(54) Tag <uses-permission> attribute name has invalid character '-'.
- xmapp 配置
- CP2K4.1-release & 最新5.x-development 多进程多线程(MPI+OPENMP) (psmp版 & popt版)超详细编译安装教程极致优化加速版(全编译器可编译版)
- Lua 之使用 VS 生成解释器、编译器和链接库
- ARKit 再显神通,快速重拍《Take On Me》音乐视频
- scrapy打造知乎后花园三: 抓取关注用户数据 json异步动态加载
- 纯css好看的div选中效果
- MongoDB两阶段提交实现事务
- 给EditText的drawableRight属性的图片设置点击事件
- 使用Redis的管道(Pipeline)进行批量操作
- MVC
- OracleDatabase安装在Linux上报错pdksh的问题