C++项目中添加调用Lua脚本

1.2k 词
    <h2 id="前言"><a href="http://xtutu.me/#%E5%89%8D%E8%A8%80" class="headerlink" title="前言"></a>前言</h2><p>最近想着,如果进程在运行时,可以调用Lua、JS之类的脚本语言,那么对于策划来说,原本需要填很多行的数据,现在只需填一个公式就搞定了。但是一开始对于这些的需求,我是拒绝的,因为一直觉得在C++环境中添加脚本支持是非常复杂的一件事情。<br></p>

JS or Lua ?

既然想着用脚本,那么首先想到的就是js、lua。因为之前做过cocos2dx-js开发的,它用的js引擎是SpiderMonkey,太庞大了,所以不做考虑…
然后就剩下lua了,做了这么多年开发,听到过不少关于lua的话题。比如ios下的一个按键精灵的进程,就是可以让用户用lua来写进程。而且cocos2dx本身也有一个lua的版本,也是被很多开发者所采用的,所以技术上应该没什么问题。再加上lua语言本身就具有与C++语言交互方便的优势,所以就决定选择Lua。

实现

既然确定用lua了,那就开始动手了。
官网地址
在下载页面可以看到,官网已经提供了lua的源码,以及各个平台的二进制版本的下载。因为考虑到不同平台下的二进制文档不一样。所以这里我下载的源码(直接把源码加到工程里面编译)
把下载下来的源码文档加到工程里面去,这里需要注意的是:需要去掉其中的lua.c 和luac.c这两个文档。
执行编译,顺利完成!

测试

在测试的c++文档中引用lua的头文档

1
2
3
4
5
6
7
8
9
10
#ifdef __cplusplus 
extern "C"
{
#endif
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
#ifdef __cplusplus
}
#endif

测试lua脚本的执行

1
2
3
4
lua_State * state = luaL_newstate();
luaL_openlibs(state);
luaL_dostring(state, "print("hello lua")");
lua_close(state);

成功输出hello lua!(这一步完成,就已经说明在c++代码中使用lua脚本,完全没有问题了)
lua也提供了luaL_dofile()的函数,可以执行lua文档。

进一步了解

接下就是c++与lua之间传递数据的方式,所用到的堆栈结构也是挺巧妙的。这里就不再展开了,大家自行研究。


小结

把lua嵌入到c++中,整个过程也就半个小时,对lua的印象还是相当不错的~