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. Redis中字符串string数据类型(保存(设置键值、过期时间、设置多个键值、追加值)、获取(获取单一键值、获取多个键值))
  2. Adobe与Facebook联手推出Flash开发工具
  3. Matlab 自带机器学习算法汇总
  4. 第三日:继续恢复网站
  5. SecureCRT上传和下载文件(下载默认目录)
  6. 第三讲:Asp.Net+Autofac+EF/ADO.NET Winform OA(3)-启用DevExpress皮肤功能
  7. oracle 中文脚本,ORACLE常用脚本
  8. Linux SPI总线和设备驱动架构
  9. IOS 修改UIAlertController的按钮标题的字体颜色,字号,内容
  10. Java 获取 URL响应头的日期信息
  11. php调用airtestide,raw device
  12. table合并单元格_element ui el-table 合并单元格
  13. PCL——快速邻域搜索
  14. 测试mysql的查询速度很慢_求助,mysql统计实时数据信息的,查询速度很慢?
  15. 深度学习入门之猫vs狗(超简单)
  16. 【Blender】Coffe Shop建模思路及常用键、常见问题
  17. 数据结构第5版李春葆上机实验题答案(全部)
  18. 百度网盘web登录页-原生js实现
  19. 计算机软件研究方法与技术路线,开题报告研究方法与技术路线.doc
  20. 变量: 赋值 的几种方法

热门文章

  1. 13个免费的FLASH资源网站
  2. ANSYS_Designer仿真串扰
  3. poi 实现excel小例子
  4. Alpha阶段事后诸葛亮分析
  5. 腾讯云服务器带贵的原因?
  6. CAD/CASS批量桩号里程标注插件(6种模式)
  7. JAVA工具篇--java.awt.Robot模拟微信批量添加好友
  8. 九宫格数独c语言编程,求用C语言编一个解九宫格数独的程序
  9. SQL server 2005安装问题汇总(转)
  10. 视频号:CTO要不要写代码?阿里员工究竟挣多少钱?