标题: 在C语言程序中嵌入Lua脚本
作者: Demon
链接: https://demon.tw/programming/embedded-lua-in-c.html
版权: 本博客的所有文章,都遵守“署名-非商业性使用-相同方式共享 2.5 中国大陆”协议条款。
第一次知道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库并配置开发环境
赞赏微信赞赏支付宝赞赏
随机文章: