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

本系列教程主要介绍如何在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。

(0)

相关推荐

  • Lua教程(四):在Lua中调用C语言、C++的函数

    本教程将介绍如何在Lua里面调用c/c++函数. 在Lua里面调用c/c++函数其实是比较简单,本文将通过两个示例演示具体的做法:一个是求平均数,另一个是打印lua函数的一些参数信息. 最后,本文会介绍如何把这两个函数定义成一个模块,这样lua代码里面就可以不再使用全局的名字空间了. 前言 当我们需要在Lua里面调用c/c++函数时,所有的函数都必须满足以下函数签名: 复制代码 代码如下: typedef int (*lua_CFunction) (lua_State *L); 换句话说,所有的

  • Lua教程(二):C++和Lua相互传递数据示例

    这是我的Lua系列教程的第二篇,本篇文章主要介绍C++和Lua相互传递数据.如果你还不知道怎么在c/c++里面调用Lua脚本的话,请参考这篇文章. 本文主要介绍基本数据类型的传递,比如整形(int),字符串(string).数字(number)及bool值. 加载并运行Lua脚本 由于在上一个教程里面已经介绍过如何在C/C++里面嵌入Lua,所以这一节就简单的介绍一下程序怎么用,配置就略过啦. 创建Lua虚拟机 复制代码 代码如下: lua_State *lua_state = luaL_new

  • Lua教程(六):绑定一个简单的C++类

    本文是最后一篇C/C++与Lua交互的教程,在此之后,我们会结合Cocos2D-X来介绍Lua绑定.本文主要介绍如何绑定一个简单的C++类到Lua里面,并且提供Lua的面向对象访问方式. 绑定C++类 定义C++类 首先,我们定义一个Student类,它拥有名字(字符串类型)和年龄(整型),并且提供一些getter和setter,最后还提供了一个print方法.这里有Student类的定义和实现:Student.h和Student.cpp 编写绑定代码 首先,让我们编写在Lua里面创建Stude

  • Lua教程(五):C/C++操作Lua数组和字符串示例

    本文将介绍如何在C/C++里面操作Lua的数组和字符串类型,同时还会介绍如何在C/C++函数里面存储Lua状态(registry和upvalue),而registry在使用C/C++自定义类型时非常有用,可以方便地为userdata指定metatable. C/C++操作Lua数组 Lua数组Overview 在Lua里面,数组只不过是key为整数的table而已.比如一个table为array = {12,"Hello", "World"},它是一个数组,可以用下

  • Lua教程(三):C语言、C++中调用Lua的Table示例

    从写上一篇Lua的文章到现在,已经过去半月有余了,是时候让自己的Lua状态refresh一下了.本教程将介绍Lua的栈及基本栈操作,同时还有如何在C/C++代码里面读取Lua的Table. 理解Lua栈 Lua通过一个"虚拟栈"与C/C++程序进行数据交互,所有的Lua C API都是通过操作这个栈来完成相应的数据通信. Lua的这个"虚拟栈"解决了C/C++程序与Lua程序通信的两大问题: 1.Lua使用垃圾回收,而C/C++需要手动管理内存. 2.Lua使用动态

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

    本系列教程主要介绍如何在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教程(二十):Lua调用C函数

    Lua可以调用C函数的能力将极大的提高Lua的可扩展性和可用性.对于有些和操作系统相关的功能,或者是对效率要求较高的模块,我们完全可以通过C函数来实现,之后再通过Lua调用指定的C函数.对于那些可被Lua调用的C函数而言,其接口必须遵循Lua要求的形式,即typedef int (*lua_CFunction)(lua_State* L).简单说明一下,该函数类型仅仅包含一个表示Lua环境的指针作为其唯一的参数,实现者可以通过该指针进一步获取Lua代码中实际传入的参数.返回值是整型,表示该C函数

  • PHP获取表单数据与HTML嵌入PHP脚本的实现

    php接受通过HTML表单提交的信息时,会将提交的数据保存在全局数组中,我们可以调用系统特定的自动全局变量数组来获取这些值. 常用的自动全局变量如下所示: 1.GET方式 功能:获取get方式提交的数据 格式:$_GET["formelement"] 2.POST方式 功能:获取post方式提交的数据 格式:$_POST["formelement"] 3.REQUEST方式 功能:获取任意方式提交的数据,$_REQUEST自动全局变量包含了所有GET.POST.CO

  • 在Mac OS中安装Lua的教程

    Lua 是一个轻量级的编程语言,在游戏开发上使用非常多.在这篇文章中,我们将向你介绍在 Mac OS X 系统上安装和使用最新版本的 Lua 5.2.1. 如果你的系统已经安装了 Rudix,只需要执行 sudo rudix install lua 即可,否则 Rudix 提供一些独立的软件包用来安装,打开你的浏览器并根据系统选择相应的版本来安装. 下载之后双击安装包并执行如下的安装指令: Lua 将默认安装到 /usr/local/ ,Lua 解释器完整的路径是 /usr/local/bin/

  • C++中调用Lua函数实例

    唉,今天心情有点糟糕,我就少说一些啰嗦的话了. (旁白:太好了-) 上一章传送门:http://www.jb51.net/article/55096.htm 经过前面几章的介绍,相信大家对Lua的堆栈已经比较熟悉了,如果还不是很熟悉的朋友,建议多看几遍前面的教程,或者多敲几次代码. 那么,如果已经对Lua的堆栈比较熟悉,接下来的内容就很简单了. 今天我们来看看C++如何调用Lua的函数,先看看现在Lua文件是什么样的: 复制代码 代码如下: -- helloLua.lua文件 myName =

  • Lua教程(一):简介、优势和应用场景介绍

    一.简介: Lua作为目前最为流行的.免费轻量级嵌入式脚本语言,在很多工业级的应用程序中被广泛应用,如Adobe's Photoshop,甚至是在一些著名的游戏程序中也被大量使用,如星际.不仅如此,由于Lua具备很多特殊的优点,如语法简单(基于过程).高效稳定(基于字节码).可以处理复杂的数据结构.动态类型.以及自动内存管理(基于垃圾收集)等,因此在很多嵌入式设备和智能移动设备中,为了提高程序的灵活性.扩展性和高可配置性,一般都会选择Lua作为它们的脚本引擎,以应对各种因设备不同而带来的差异.

  • C++中调用Lua配置文件和响应函数示例

    Lua是脚本语言,最大的优势就是轻巧灵便,不用编译.当C的框架写好,只要更改lua的相应处理即可以更改功能,并且不用重新编译.以下是在C中调用Lua资源方法的示例程序:   C++端: // Lua1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<stdio.h> extern "C" { //如不用extern会出现连接错误,编译成了C++文件 #include <lua.h> #

随机推荐