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,把预编译头取消

新建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

最后贴一下资源管理器的目录结构

文件结构

include文件夹

dll文件夹

lib文件夹

D://engine//lua5.3 加入到环境变量 path,就可以在命令行使用解释器和编译器;在 C 应用程序中想要嵌入 lua 代码,如果使用静态链接库的方式,则把 include 文件夹和 lib 文件包含到项目中;如果使用动态链接库的方法,则把 include 文件夹和 dll 文件夹包含到项目中。

阅读全文
0 0
原创粉丝点击