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

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 文件了

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

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

tolua

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: tolua是一种用于将C/C++代码绑定到Lua脚本语言的工具。tolua 1.0.93是tolua工具的一个特定版本,并且是已经经过编译的版本。通过编译好的tolua 1.0.93,我们可以方便地在Lua使用C/C++代码,实现更高级的功能或者优化性能。 在使用编译好的tolua 1.0.93时,我们首先需要将tolua的头文件和库文件正确地链接到我们的项目中。然后,我们可以使用tolua的API来定义Lua脚本中可以访问的C/C++函数,并将它们绑定在一起。通过这种方式,我们可以在Lua脚本中调用这些C/C++函数,实现复杂的功能。 tolua 1.0.93编译好的版本带来了一些改进和优化,可能修复了之前版本中的一些bug,提高了性能和稳定性。这使得我们能够更好地利用Lua和C/C++的优势,使二者结合更加方便和高效。 总之,tolua 1.0.93 编译好的版本是一种方便的工具,通过它我们可以将C/C++代码与Lua脚本相结合,从而实现更高级和更复杂的功能。 ### 回答2: "tolua 1.0.93编译好的"是指tolua的一个特定版本,它已经经过编译,可以直接在相应的平台上使用。 tolua是一个开源项目,它允许开发者用C/C++来编写Lua的扩展模块。Lua是一种脚本语言,可嵌入其他应用程序中使用,tolua则为嵌入到C/C++应用程序中的Lua提供了一个简单的扩展方法。 通过编译好的tolua 1.0.93版本,开发者可以在他们的应用程序中直接使用Lua语言以及通过C/C++编写的扩展模块。这样可以在不用对Lua进行大量的C语言绑定操作的前提下,实现对应用程序的灵活扩展。 编译好的版本意味着它已经经过编译器的处理,可以直接在相应的平台上运行,无需再进行编译步骤。这为开发者提供了更为方便的使用方式,可以节省时间和精力。 总之,tolua 1.0.93编译好的版本是一个可以直接在应用程序中使用的已编译版本,它提供了一种简单的方法将Lua与C/C++结合,以实现应用程序的扩展功能。 ### 回答3: tolua 1.0.93 是一个已经编译好的开源工具,用于将C/C++代码转换为Lua脚本。它是一个由多个C语言文件组成,并且已经被编译为可执行文件供用户直接使用使用这个编译好的版本,用户可以方便地将已有的C/C++代码整合到Lua环境中,并且可以使用Lua的一些特性和库对代码进行扩展和增强。tolua 1.0.93提供了一组API,让用户可以在Lua环境中调用C/C++代码,并且可以实现C/C++Lua的双向数据传递。 使用tolua 1.0.93编译好的版本,用户可以享受到编译程序带来的便利,无需进行源代码的编译和配置,只需要将已经编译好的工具集成到项目中即可。同时,这个版本也同时提供了相应的文档和示例,方便用户快速上手和了解如何使用。 总之,tolua 1.0.93 编译好的版本为用户提供了一种快速将C/C++代码与Lua脚本结合的方法,使得开发者可以更加灵活和高效地利用Lua的特性和C/C++强大的计算能力,从而更加方便地开发出功能丰富的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值