tolua++ 是用来把 C++代码 生成 在Lua中使用的接口的工具,编译步骤比较繁琐。

使用tolua有以下步骤:

  1. 工程建立
  2. 编写c/c++文件.
  3. 编写.pkg文件,填写需要导出的c/c++接口.
  4. 使用tolua可执行程序将pkg接口导出成LuaVm可调用的栈交互c/c++文件.
  5. 将第三步生成的文件和其他c/c++文件一起编译生成最终的可执行程序.

1.  工程建立:

1).下载http://www.lua.org/versions.html#5.3

2).下载tolua-5.2.4

Tulua官网http://webserver2.tecgraf.puc-rio.br/~celes/tolua/,更新到tolua-5.2.4,支持lua5.2.4。官网只提供了tolua的源代码,没有提供任何程序。

下载代码解压后,在src目录下有三个目录,如下:

Bin目录中包含了生成tolua++.exe转换程序的代码,我以使用VS2015编译,文章最后有下载地址。

Lib目录包含了程序使用tolua时需要包含的库的代码,因为代码比较少,我一般直接将lib文件夹中的代码直接包含到程序中。

Tests目录包含了tolua的一些例子,这些例子我以全部使用VS2015进行了编译,文章最后有下载地址。

3) VS2017工程建立

a.  lua5.3.5: 在项目中去除掉lua.c和luac.c文件.

b.  tolua在Bin目录下有两个.c文件,tolua.c、toluabind.c,将这两个文件加入到项目中,另外项目中还须要lua5.2.4代码和Lib目录下的代码.。如下:

1. tolua++.exe 生成

2. tolua++.lib

修改完成后再点击编译,终于生成“tolua++.exe”文件了:

编写pkg文件

pkg文件语法,这里不讲解,具体情况tolua官网:http://webserver2.tecgraf.puc-rio.br/~celes/tolua/tolua-3.2.html。语法规则不多,与C++非常接近,很容易看懂。

导出源文件

上面讲了使用 tolua 的三部曲,下面使用实际例子讲解一下。首先,正常编写 c++ 代码,这里我们创建一个类

原始头文件

//mylib.h
class Test
{
public:
    Test(int a, int b);
    ~Test();
    void sayHello();
    int add();
    int getA();

private:
    int a;
    int b;
};

原始源文件

//mylib.cpp
#include "mylib.h"
#include <iostream>

Test::Test(int a, int b)
{
    this->a = a;
    this->b = b;
}

Test::~Test()
{
}

void Test::sayHello()
{
    std::cout << "hello world" << std::endl;
}

int Test::add()
{
    return this->a + this->b;
}

int Test::getA()
{
    return this->a;
}

package 文件

$#include "mylib.h"
class Test
{
    Test(int, int);
    ~Test();
    void sayHello();
    int add();  
    int getA();
};

可以看到 package 文件和 c++ 头文件基本一致,要注意的是要在文件头引入头文件,然后把 public 关键字去掉。所有公有的函数或数据都可以导出,如果不想导出某个函数,则在 package 文件中不要定义就可以了。

然后打开命令行,输入下面的命令

tolua -n mylib -o tolua.cpp mylib.pkg

导出的文件名可以任意命名,但因为我们已经有一个原始的源文件 mylib.cpp 了,所以这里不能将导出的源文件命名为 mylib.cpp,否则后面使用的时候就会有问题,这里我命名为 tolua.cpp。还有一个要注意的就是必须把 mylib.h 跟 mylib.pkg 放在一起,因为 package 文件需要用到头文件(第一行就已经引入头文件了)

现在我们有了 mylib.h、mylib.cpp 和 tolua.cpp 这三个文件,接下来就可以在项目中使用了
在 c++ 程序中使用 tolua

新建一个 c++ 控制台程序,因为要使用到 lua 和 tolua,所以要把相应的头文件和库文件包含进来,头文件有 lua.h、lualib.h、lauxlib.h、lua.hpp、luaconf.h 和 tolua.h,库文件则有 lua.lib 和 tolua.lib。

首先,我们先来测试一下 lua 环境,新建一个 main.cpp 文件,输入下面代码

//main.cpp
#include <iostream>
extern "C"
{
#include "lualib.h"
#include "lauxlib.h"
}

using namespace std;

int main()
{
    int tolua_mylib_open(lua_State*);
    lua_State* state = luaL_newstate();
    luaL_openlibs(state);

if (luaL_dostring(state, "print([[hello world]])") != 0)
    {
        cout << "excute lua file failed!" << endl;
    }
    lua_close(state);

system("pause");
    return 0;
}

如果正确打印出 “hello world”,则说明 lua 环境没有问题,否则就检查一下头文件和库文件是否正确引入了

接下来把 mylib.h、mylib.cpp 和 tolua.cpp 这三个文件添加到项目中,我们先来分析下 tolua.cpp 这个文件的内容

static int tolua_collect_Test (lua_State* tolua_S){}

static void tolua_reg_types (lua_State* tolua_S){}

//对应构造函数
static int tolua_mylib_Test_new00(lua_State* tolua_S){}

//对应析构函数
static int tolua_mylib_Test_delete00(lua_State* tolua_S){}

//sayHello
static int tolua_mylib_Test_sayHello00(lua_State* tolua_S){}

//add
static int tolua_mylib_Test_add00(lua_State* tolua_S){}

//getA
static int tolua_mylib_Test_getA00(lua_State* tolua_S){}

LUALIB_API int luaopen_mylib (lua_State* tolua_S){}

TOLUA_API int tolua_mylib_open (lua_State* tolua_S){}

这里只列出主要的几个函数,可以看到 tolua 在导出 c++ 源码的时候为每个函数都生成一个对应的静态函数;除此之外,还有几个重要的函数,tolua_collect_Test 用于垃圾回收,tolua_reg_types 用于注册类名,toluaopen_mylib 用于打开库函数,tolua_mylib_open 用于打开 tolua,这是我们唯一关心的函数,在使用 tolua 之前必须先调用这个函数,这样所有导出的 c++ 函数就可以在 lua 中使用了

接下来开始测试在 lua 中访问 c++ 函数,新建一个 test.lua 文件,输入下面代码

local test = Test:new(1, 2)
test:sayHello()
print("a = " .. test:getA())
print("a + b = " .. test:add())

然后修改 main.cpp 文件

#include <iostream>
extern "C"
{
#include "lualib.h"
#include "lauxlib.h"
}
#include "mylib.h"

using namespace std;

int main()
{
    int tolua_mylib_open(lua_State*);
    lua_State* state = luaL_newstate();
    luaL_openlibs(state);
    tolua_mylib_open(state);

if (luaL_dofile(state, "scripts/test.lua") != 0)
    {
        cout << "excute lua file failed!" << endl;
        lua_close(state);
        return 1;
    }
    lua_close(state);

system("pause");
    return 0;
}

首先,要引入 mylib.h 头文件,然后调用 tolua_mylib_open(state); 打开 tolua,这个函数在 tolua.cpp 文件中定义和实现,main.cpp 并不知道这个函数,所以要在使用前手动定义一下 int tolua_mylib_open(lua_State*);,之后就可以执行 test.lua 文件了

如果没错误,将会看到下面的执行结果

如果没错误,将会看到下面的执行结果

三国杀(1):VS2017 C/C++ lua tolua++ 编译 集成,及使用介绍相关推荐

  1. 三国杀(2):QT5.12 C/C++ lua tolua++ 编译 集成,及使用介绍

    最近对lua比较感兴趣,工欲善其事必先利其器,方便下一步的学习. 一. 下面两张图比较形象描述了lua语言定位及交互方法: (1) Lua可以让程序员开发在Lua脚本中调用C/C++函数的接口,这个接 ...

  2. 使用tolua++编译pkg,从而创建自定义类让Lua脚本使用

    2019独角兽企业重金招聘Python工程师标准>>> 在Lua第三篇中介绍了,如何在cocos2dx中使用Lua创建自定义类供Lua脚本调用使用,当时出于Himi对Lua研究不够深 ...

  3. Dota传奇/开心消消看/天龙八部3 Lua 反编译

    <Dota传奇> Lua 反编译 Lua源代码下载 : http://download.csdn.net/detail/liutianshx2012/8553579 <<开心消 ...

  4. Lua游戏逆向及破解方法介绍

    背景介绍 随着手游的发展,越来越多的Cocos-lua端游开发者转移到手游平台.Lua脚本编写逻辑的手游也是越来越多,如梦幻西游.刀塔传奇.开心消消乐.游龙英雄.奇迹暖暖.疾风猎人.万万没想到等手游. ...

  5. lua qt 编译_Win32下 Qt与Lua交互使用(一):配置Qt下Lua运行环境

    偶然间看到Lua这种脚本语言,有点兴趣,简单学习了一下.html 发现Lua与C++之间能够实现很是强的交互性.Lua中能够使用C++中的函数,C++中也能够使用Lua中的函数.由此能够引起出不少奇思 ...

  6. win10+vs2017+caffe(crnn)编译过程记录(验证成功)

    一.准备工作 在windows下使用vs2017编译,使用cmake生成项目工程,caffe依赖很多第三方库,编译之前准备好,具体见下图: 二.生成工程 1.勾选advanced 2.blas选择op ...

  7. lua是编译成c语言再执行嘛,go_lua_c: 使用go编译lua脚本为字节码,通过网络传给c,通过c执行lua脚本。...

    go_lua_c 项目介绍 使用go编译lua脚本为字节码,通过网络传给c,通过c执行lua脚本. 本项目包含go - lua - c之间相互调用的方法,值得学习 如何使用 1.windos先安装mi ...

  8. linux安装lua相关编译报错

    1.报之类的错误 /usr/lib/libreadline.so: undefined reference to `PC' /usr/lib/libreadline.so: undefined ref ...

  9. lua 的编译和使用

    1 下载lua; 到lua目录下执行 etc/luavs.bat  即可 2 vs中 2.1  general指定头文件依赖目录 2.2  input目录输入依赖的lib名  lua51.lib 2. ...

最新文章

  1. infer的用法_typescript高级用法之infer的理解与使用
  2. typedef BOOL(WINAPI *MYFUNC) (HWND,COLORREF,BYTE,DWORD);语句的理解
  3. 第五周实践项目6 数制转换(栈)
  4. Go题目 自己做的 不完善的地方请评论指出
  5. c++------------之---【虚析构函数应用】
  6. 史上最污技术解读,60 个 IT 术语我竟然秒懂了......
  7. select标签如何设置默认选中的选项
  8. 软考高项笔记 | PERT 三点估算
  9. 计算机常用函数及写法,计算机常用的函数公式有哪些?
  10. 使用POI 删除批注
  11. 中关村科技企业融资缺口700亿 商业银行垂涎
  12. 5.5 listen() --- 如果有“人”,请叫我?
  13. html和js画圣诞树图片,基于JS2Image实现圣诞树代码,
  14. 一个立体仓库无线网络故障诊断分析案例
  15. 有道云笔记MarkDown插入图片-解决有道云插入图片需要开通会员的问题
  16. JQuery实现超链接鼠标提示效果的方法
  17. jira 连接 mysql_JIRA使用教程:连接数据库—MySQL
  18. ae教程 (四)运动控制 (一)
  19. 物流中转站---最短距离和
  20. JAVA计算机毕业设计网上购物商城(附源码、数据库)

热门文章

  1. 计算机改变生活英语作文,改变我们的生活英语作文
  2. parrallel for matlab,[转载]MATLAB并行计算工具箱 -- Paralleln
  3. 如何配置SQL Server数据库远程连接
  4. android 判断U盘是否挂载
  5. CSS实现水平垂直居中的几种方式
  6. 安卓在线视频播放器,视频路径为中文
  7. 电工知识 电气图形符号和电气文字符号大全
  8. 【吐槽系列】如何用最贱蛋的方式将web程序变为桌面应用
  9. 微信小程序全局变量注意这四点,让你轻松玩转全局变量
  10. 鸿蒙系统暗黑2,暗黑2 二十大最难爆出来的暗金装备(上)