在C语言程序中嵌入Lua脚本

标签: , , ,

第一次知道Lua语言,是上个月在书城的时候,看到一本名为《魔兽世界编程宝典》的书。心想,魔兽世界还能编程?难道是自己编一个魔兽世界出来?翻开一看,原来是编写插件,用的是一种叫Lua的脚本语言。只可惜我不玩魔兽世界,当然不会对开发魔兽世界插件感兴趣。最近在玩愤怒的小鸟,无意中发现这个游戏的地图和配置文件都是用Lua来写的,得了多少分、过了多少关等等完全可以通过修改相应的Lua脚本文件来作弊。于是心血来潮稍稍学习了一下Lua语言。

Lua程序设计语言 是一个简洁、轻量、可扩展的脚本语言。Lua读作/’lua/(噜啊),是葡萄牙语中"Luna"(月亮)的意思。Lua是一种轻量语言,它的官方版本只包括一个精简的核心和最基本的库。这使得Lua体积小、启动速度快。它用标准ANSI C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程式里。

Lua的目标是成为一个很容易嵌入其它语言中使用的语言。很多应用程序使用Lua作为自己的嵌入式脚本语言,以此来实现可配置性、可扩展性。这其中包括大话西游II、仙境传说、魔兽世界、战锤40k、博德之门、轩辕剑外传汉之云等。

要在自己的程序中使用Lua,我们必须将Lua解释器核心编译到自己的程序中来,无论是直接编译到主程序中,还是作为外部DLL调用,总之,第一件事情是编译Lua解释器核心。

首先,到Lua官方网站下载最新的Lua源代码,得到的是一个.tar.gz。可以用流行的压缩软件如WinZip,WinRAR,或者开源的7z(推荐使用)来解开。解开的目录中有一个src目录,整个Lua核心代码就在这里了。

我们在Windows平台上拟使用Visual C++ 6.0来进行试验,但是src目录中并没有VC6使用的工程文件。这个问题很好解决:在VC6中新建一个Win32 Static Library静态库工程,建议工程名称设置为liblua,在随后的工程设置向导中,不要加入任何设置,即不要勾选“Pre-Compiled Header”和“MFC Support”选项。

接下来,将所有src中的所有 .c (lua.c除外)和 .h 文件加入到工程中,编译,就可以得到我们想要的静态库 liblua.lib 文件了。

在我们自己的软件项目中,只需要 liblua.lib 和几个头文件就可以开发了,用到的头文件有:

  • lauxlib.h
  • lua.h
  • luaconf.h
  • lualib.h

在编写第一个嵌入Lua脚本的C语言程序之前,我们先编写一个test.lua脚本以供调用,代码如下:

print("Hello world")

现在我们来写一个最简单的C语言控制台程序,并在其中内嵌Lua解释器,运行该程序,可以执行test.lua脚本,在屏幕上打印出我们希望的结果。

在VC6中新建一个Win32 Console Application控制台程序工程,建议工程名称设置为testlua。将刚才编译得到的liblua.lib静态库文件和上面列出的头文件复制到工程的根目录中。新建一个 .c源文件,代码如下:

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

#pragma comment(lib, "liblua.lib")

int main(void)
{
    lua_State *L = lua_open();
    luaL_openlibs(L);
    luaL_dofile(L, "test.lua");
    lua_close(L);
    return 0;
}

看看这代码,我都不用作解释了。如果那么简单的代码都看不懂,建议你先去看看《Programming in Lua》一书。

编译上述代码,得到testlua.exe,和test.lua文件放到同一个目录下,在命令行模式执行testlua.exe,就可以看到经典的Hello world了~

就是这么简单!!下一次,我们将尝试在.lua脚本中调用主程序(testlua.exe)内部的C函数~~

参考链接:编译Lua库并配置开发环境

随机文章:

  1. 用EnumSystemCodePages函数枚举系统代码页
  2. 用Shell.Application获取图片分辨率
  3. VBS中的左移位&右移位运算
  4. VBS中没有vbHide常量
  5. VBS实现Unicode(UTF-16)转UTF-8

留下回复