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

如何引用服务器lua文件,Lua教程(一):在C++中嵌入Lua脚本相关推荐

  1. linux间服务器间文件传输,Linux命令scp服务器间文件传输教程

    scp就是secure copy,是用来进行远程文件拷贝的.数据传输使用 ssh,并且和ssh 使用相同的认证方式,提供相同的安全保证 .那么你知道Linux命令scp服务器间文件传输教程么?接下来是 ...

  2. 在windows程序中嵌入Lua脚本引擎--建立一个简易的“云命令”执行的系统

    在<在windows程序中嵌入Lua脚本引擎--使用VS IDE编译Luajit脚本引擎>开始处,我提到某公司被指责使用"云命令"暗杀一些软件.本文将讲述如何去模拟一个 ...

  3. 在windows程序中嵌入Lua脚本引擎--使用VS IDE编译Luajit脚本引擎

    前些天听到一个需求:某业务方需要我们帮忙清理用户电脑上的一些废弃文件.同事完成这个逻辑的方案便是在我们程序中加入了一个很"独立"的业务逻辑:检索和删除某个程序产生的废弃文件.试想, ...

  4. 在windows程序中嵌入Lua脚本引擎--编写自己的Lua库

    在<在windows程序中嵌入Lua脚本引擎--建立一个简易的"云命令"执行的系统>一文中,我提到了使用Lua的ffi库,可以让我们像写C代码一样写lua程序.这是个非 ...

  5. html用dom显示xml,html DOM文件引用一个XML文件将不会在浏览器中打印

    我完全不熟悉这一点,我正在上课,现在变成了一个令人头疼的问题.我有这个HTML DOM文件,它引用了一个XML文件,我需要在浏览器中显示在屏幕上.它应该只打印标题,标题,第一个,最后一个,位置,描述的 ...

  6. lua怎么嵌入php,Lua教程(一):在C++中嵌入Lua脚本

    本系列教程主要介绍如何在C/C++程序里面嵌入Lua脚本,我打算从以下几个方面来介绍: 1.如何在C/C++里面嵌入Lua脚本 2.Lua访问C/C++数据结构(这里面要介绍类,结构体,函数,变量,枚 ...

  7. lua运行外部程序_在C语言程序中嵌入Lua脚本

    第一次知道Lua语言,是上个月在书城的时候,看到一本名为<魔兽世界编程宝典>的书.心想,魔兽世界还能编程?难道是自己编一个魔兽世界出来?翻开一看,原来是编写插件,用的是一种叫Lua的脚本语 ...

  8. maven checkstyle 文件_flink教程-在IntelliJ IDEA 中玩转 checkstyle

    前言安装插件配置插件选择版本添加配置文件在项目中应用checkstyle插件具体使用 前言 当我们想给flink贡献自己的代码的时候,就需要把代码下载下来,然后导入自己的IDE,其中有一个很重要的环节 ...

  9. tgp饥荒服务器mod文件在哪,饥荒联机版中客户端mod文件夹在哪?注意不是服务器mod!...

    饥荒联机版mod使用方法的教程,很详细,一目了然.希望对大家有所帮助. 使用mod方法 [第1步] 首先打开饥荒的游戏目录,里面有一个mods文件夹 饥荒的游戏目录不知道怎么找的就不要用mod了. [ ...

  10. 服务器根目录文件配置文件,在文档根目录中存储安装和配置文件

    在文档根目录中存储安装和配置文件 wanboot-cgi 程序在 WAN Boot 安装过程中传输以下文件. wanboot 程序 WAN Boot 最小根文件系统 定制 JumpStart 文件 S ...

最新文章

  1. spring的BeanWrapper类的原理和使用方法
  2. JSON.parse()与JSON.stringify()的区别
  3. 使用axios时遇到的Request Method: OPTIONS请求,会同时发送两次请求问题
  4. IO多路复用select/poll/epoll详解以及在Python中的应用
  5. 史上最牛研究生,总结出惠人无数的“十大经验”,并发表于Nature Medicine
  6. VSCode自定义代码片段4——cli的终端命令大全
  7. 11.4 final类
  8. 任正非:华为的岗位没有年龄限制;腾讯微博将于9月28日停止运营;微软关闭Visual Studio Online|极客头条
  9. Unity3d 镜面反射 vertex and frag Shader源代码
  10. 会议室预定模拟登陆网站
  11. linux/centos shell脚本中非交互式修改密码
  12. CCNA3.0中文版教材
  13. GhostXP SP3 中关村系统装机版 2013
  14. 推荐3个计算机专业的英文电子书下载网站
  15. The PyTorch-Kaldi Speech Recognition Toolkit
  16. IIS本地FTP服务器搭建
  17. s5pv210 linux,S5PV210-零基础体验uboot
  18. k8s搭建--裸机搭建(Bare Metal)
  19. 求n阶矩阵的逆矩阵(C语言实现)
  20. 全体自然数的和是负十二分之一?

热门文章

  1. 单片机复位电路是怎么工作的?
  2. 【Python】 Python小游戏-贪吃蛇大冒险
  3. 琵琶行·并序--白居易
  4. Lenient assertions(Unitils介绍三)
  5. Android逆向分析——得到SO基址的方法
  6. Android App瘦身新姿势——Android App Bundle
  7. 微信小程序投诉页面与交互设计
  8. 胡雪岩与王有龄交浅言深的那些事
  9. 大学计算机python基础_大学计算机python基础课件2015lecture17
  10. gds是什么系统简称_气体检测仪GDS系统是什么系统?