当前位置: 移动技术网 > IT编程>脚本编程>Lua > Lua教程(一):在C++中嵌入Lua脚本

Lua教程(一):在C++中嵌入Lua脚本

2017年12月08日  | 移动技术网IT编程  | 我要评论
本系列教程主要介绍如何在c/c++程序里面嵌入lua脚本,我打算从以下几个方面来介绍: 1.如何在c/c++里面嵌入lua脚本 2.lua访问c/c++数据结构(这里面

本系列教程主要介绍如何在c/c++程序里面嵌入lua脚本,我打算从以下几个方面来介绍:

1.如何在c/c++里面嵌入lua脚本

2.lua访问c/c++数据结构(这里面要介绍类,结构体,函数,变量,枚举等数据类型在lua里面如何访问)

3.c/c++访问lua的数据,主要是基本数据类型,函数和table

4.cocos2d-x里面的lua绑定(含自动绑定与手动绑定)

5.cocos2d-x里面lua和c/c++相互调用

6.cocos2d-x里面lua和java相互调用

7.cocos2d-x里面lua和objective-c相互调用

本系列教程不会过多地介绍lua的基本语法,关于lua基本语法的学习,推荐《programming in lua》。 如有纰漏,欢迎指出,谢谢。

另外,关于更新时间,每周一篇,定期或者不定期,呵呵。

mac项目集成lua

准备工作

首先,新建一个控制台应用程序。 打开xcode,new->project->osx->command line tool,取名为lesson01如下图所示:

接下来,我们需要下载lua5.2.3.下载完后,解压缩,然后cd到刚刚解压缩的路径下面,输入make macosx,这样便可以生成mac下面的lib文件。

接下来把刚刚解压缩的文件夹拷贝到你新建的工程下面,然后设置include路径和library路径。(注意,这里是不需要把头文件添加到xcode里面的,只要指定include路径,编译的时候,编译器会自动去找的。)

因为我的lua文件夹的路径是:xxxx/lesson01/lua-5.2.3,所以,我把search path和library path分别设置为:

复制代码 代码如下:

//search path
$(srcroot)/lesson01/lua-5.2.3/src/
//library path
$(project_dir)/lesson01

下面是我的工程与lua之间的目录结构,liblua.a文件是从src里面拷贝出来的。(前面我们使用make macosx生成出来的)

注意:如果直接添加lua的所有源码,则会编译报错。因为lua.c里面也有一个main函数。这个main函数是用来生成可执行程序的。 另外,如果是添加其它第三方的库,也可以参考这个方法,添加search path和library path

c++调用lua文件

首先,打开main.cpp,并包含以下头文件:

复制代码 代码如下:

#include "lua.hpp"

如果此时编译不报错,则说明你之前设置的search path是正确的,如果报错,请自行调整search path。

这里面的lua.hpp的内容如下:

复制代码 代码如下:

extern "c" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}

这才是大多数lua教程里的代码嘛。然后在main函数里面添加以下内容:

复制代码 代码如下:

/1. 初始化lua虚拟机
lua_state *lua_state;
lua_state = lual_newstate();
//2.设置待注册的lua标准库,这个库是给你的lua脚本用的
//因为接下来我们只想在lua脚本里面输出hello world,所以只引入基本库就可以了
static const lual_reg lualibs[] =
{
    { "base", luaopen_base },
    { null, null}
};
//3.注册lua标准库并清空栈
const lual_reg *lib = lualibs;
for(; lib->func != null; lib++)
{
    lual_requiref(lua_state, lib->name, lib->func, 1);
    lua_pop(lua_state, 1);
}
//4、运行hello.lua脚本
lual_dofile(lua_state, "hello.lua");
//5. 关闭lua虚拟机
lua_close(lua_state);

新建lua文件

选择new->file->other,然后命名为hello.lua, 以下是hello.lua里面的内容:

复制代码 代码如下:

print "hello world"

编译并运行

此时编译并运行,这时可能看不到控制台输出”hello world”。因为你的lua脚本没有拷贝到程序里面去,我们需要再设置一下。如下图所示: (注意:subpath要清空,copy only when installing去掉打勾)

这时,编译并运行,你会得到如下结果 :

接下来,我们讲讲ios项目怎么集成lua。

ios项目集成lua

ios项目集成lua的方式与mac大同小异,顺便补充一句,lua本质上是一个c程序,任何平台下面集成相应c库的方法都是适用的。

这里我主要写一些注意事项吧:

1.我们刚才编译好的macosx库只能给mac程序用,ios需要单独编译(当然,windows和linux也需要再单独编译,编译方法见下载的lua-5.2.3/doc/readme.html)

2.编译ios可以通过添加一个static library,然后把所有的lua文件添加到这个library里面。最后,让主项目依赖这个library就可以了。

3.直接使用lual_dofile(lua_state, “hello.lua”)是行不通的,因为ios项目的资源路径在一个沙盒里。我们必须取得全路径才可以访问到这个hello.lua文件。以cocos2d-x为例,我们可以使用下面的代码获得hello.lua的全路径,然后再传递给lua虚拟机。

复制代码 代码如下:

  std::string scriptpath = fileutils::getinstance()->fullpathforfilename("hello.lua");
    int status = lual_loadfile(lua_state, scriptpath.c_str());

android项目集成lua

android集成lua需要使用android.mk把lua打包成一个静态库,然后在项目里面包含这个lua模块。具体的做法可以参考cocos2d-x。

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网