zoukankan      html  css  js  c++  java
  • tolua++使用

    tolua++ 配置

    看到很多方法将lua和c++结合的办法,由于看到cegui使用的是tolua++,所以决定使用tolua++。

    1、下载tolua++
    www.codenix.com/~tolua/

    2、找到 tolua++-1.0.93\win32\vc7文件夹,编译程序生产tolua++.exe
    (我用的include和lib都是cegui里的,统一版本比较好)

    3、测试tolua++(下面是参照他人的http://blog.csdn.net/foruok/archive/2008/04/17/2301751.aspx)

    创建tarray.pkg文件:$#include "tarray.h" 
    extern int g_Arr[10]@Arr;很简单,$#include "tarray.h",包含实际的C头文件,这个语句会去掉$符号,直接插入到tolua++.exe生成的C文件中。文档中说$lfile,$cfile,$ifile会特别处理,我试验了下,不像说的那个样子。    
    extern int g_Arr[10]@Arr,tolua++会分析这一句,将g_Arr[10]映射到lua中的Arr上。其中@后面是你想在lua中看到的变量名。    

    tarray.h文件也只有一句:#ifndef _TESTARRAY_H
    #define _TESTARRAY_H 
    extern int g_Arr[10]; 
    #endifg_Arr的实例在一个cpp文件中。    

    用tolua++.exe生成用于导出c++对象到lua脚本中的CPP文件:tolua++.exe -n tarray -o tarray.cpp tarray.pkg-n tarray选项指定包的名字为tarray。如果不用-n显式指定,tolua++.exe会生成一个和pkg文件名一样的包名,同时生成 tolua_**_open(lua_State*)入口函数。         将此CPP文件加入工程。   

    注意:应该CEGUI的tolua++.h修改过,他是用于dll的
    所以在生成的tarray.cpp也要做修改
    在文件里加入一行
    #define TOLUA_API extern

    程序主文件array.cpp:#include "stdafx.h"

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

    int tolua_tarray_open (lua_State* tolua_S);

    #include "tarray.h"

    int g_Arr[10]={0};

    int _tmain(int argc, _TCHAR* argv[])
    {    
    lua_State * L = lua_open();    
    int i=0;    
    for(i=0; i<10; i++)
    g_Arr[i] = i;
    luaopen_base(L);
    tolua_tarray_open(L);
    luaL_dofile(L, "tarray.lua");
    printf("now in c++, re-show Arr: ");
    for(i=0; i<10; i++)
    printf("%d ", g_Arr[i]);
    printf(" ");
    lua_close(L);
    getchar();
    return 0;
    }luaopen_tarray_open是必须要调用的,tolua++.exe根据你命令行中指定的名字生成tolua_**_open函数。该函数用 来导出c++对象到lua脚本中,所以必须在你执行lua脚本之前调用。函数的原型在由tolua++.exe生成的cpp文件中。    

    脚本文件array.lua内容如下:print("now in lua script! try to print 'Arr' by name:")
    print(Arr) 
    --print contents of Arr
    print("now print 'Arr':")
    for i=0,9 do
    print(Arr[i])
    end 
    --change contents of Arr
    print("now change the Arr.")
    for i=0,9 do
    Arr[i] = i*2
    end
    如果成功就会有下图结果:

    原文:

    http://hi.baidu.com/ton666/item/29f9f603c3ad21dddde5b0c5

     

    使用tolua++创建基于C\C++语言的lua脚本

    一.tolua++简介
          tolua++是一种第三方的软件包,可以为Lua提供面向对象的特性,这样我们就可以使用Lua来编写使用C++语言库的脚本文件.

    二.tolua++的编译.
         tolua++的主页在
    http://www.codenix.com/~tolua/,为了使用tolua++,我们需要三个文件:
            1.bin/tolua++[.exe] - tolua++的可执行程序
            2.include/tolua++.h - tolua++的头文件
            3.lib/libtolua++.a or lib/tolua++.lib - tolua++的静态库(当然有的时候也需要生成动态库,可以参考我下面给出的文章的网址,我们先从最简单的入手)
           使用tolua++的时候,都需要使用tolua++的可执行程序自动生成一个.pkg文件生成对应的.c(C语言)或者.cpp文件(C++语言),然后把这个文件和对应的C\C++文件一起编译生成可执行程序,这样就可以对对应的Lua脚本进行读取操作.在后面将结合代码例子对这个过程进行详细的讲解.

            tolua++的编译比较麻烦,官方的编译说明需要scons这个软件,下面介绍另一种办法,只需要Lua就可以了(本身编写Lua脚本文件不可能不用到Lua解释器,所以这个算不上什么负担了:)
           说明一下,这个办法不是我想出来的,出处在这里:
            
    http://lua-users.org/wiki/CompilingToluappWithoutScons
           官方下载的tolua++文件夹里面已经有了上面提到的1和2文件了,我在这里偷懒,就只说3的生成.
           其实在上面的文档里面写得很清楚了,如下编译生成静态库文件:     

    tolua++_1.0.5-1\src\lib> gcc -c *.c  -I..\..\include -I <path_to_lua>\include
    tolua++_1.0.5-1\src\lib> ar rcsv libtolua++.a *.o

          
            <path_to_lua>的意思是这里输入的是lua源代码包的路径,gcc中的-I参数用于指定include文件的位置.
           生成了这三个文件之后,如果需要使用它们的话,需要把它们拷贝到相应的路径.windows下面一般的会使用cygwin这个工具,以它为例说明:
    1.可执行文件放在cygwin根目录的bin目录下
    2.头文件放在cygwin根目录下的usr\include下面
    3.静态头文件放在cygwin根目录下的lib目录下面
    说明:如果没有Lua语言的对应的可执行文件,头文件,lib文件一样不能使用tolua++,对于配置lua脚本解释器的过程和上面类似.
    OK,这样一个tolua++的编译环境就配制好了,如果你在原先安装cygwin的时候没有指定cygwin的可执行文件的目录,那么对于windows下面的用户可以在"我的电脑"-"属性"-"高级"-"环境变量"-"Path"里面修改,
    比如我在里面加入我的cygwin的bin目录:C:\cygwin\bin,大功告成~~windows下面的用户只用gcc的话不一定非得使用cygwin,毕竟太大了,有人喜欢使用mingw,配置的方法类似~~


    三.代码例子
            tolua++的源码包下载下来之后在根目录的src\tests中有很多代码例子,我们随便找其中的tarray一组作为讲解的对象.

            这一组中包含的有对应的pkg文件,c文件,h文件和最后用于测试的lua脚本文件.pkg文件是用于声明我们允许后来使用的Lua脚本使用的变量,常量,类,函数等等的一个声明列表,这个列表中的所有东西都必须在对应的C++文件中给出来,不然是无法使用的.pkg文件的语法和C\C++的语法比较类似,可以到tolua++的官方网站上去看看,这里不再详述.
            使用pkg文件我们可以生成一个对应的C或者C++文件,可以这样做:

    tolua++ -o test.c tarray.pkg


            生成的test.c就是对应的c文件,你打开这个文件看看,基本上都需要上千行的代码.

            打开tarray.c看看,为了使用Lua我们还需要作些什么,除去基本的数据的定义和main之外,还需要这些:
    1.包含lua头文件:

    #include "lualib.h"
    #include "lauxlib.h"


    2.调用Lua脚本:
    省略去不重要的部分,有这些代码:

     int  tolua_tarray_open (lua_State*);
     lua_State* L =
     lua_open();
     //.

     luaopen_base(L);
     tolua_tarray_open(L);
     lua_dofile(L,"tarray.lua");//执行lua脚本

     lua_close(L);

     

            OK,现在来看看如何使用:
           首先,生成tarray.o文件:

    gcc tarray.c -c


           其次,生成test.o文件:

    gcc test.c tarray.h -c

           最后,把两个文件链接起来,注意要加入Lua和tolua++的lib文件:

    gcc -o tarray.exe tarray.o test.o -llua -llualib -ltolua++

           好了,现在大功告成,我们编写一段Lua代码调用C中的变量(源码中带有的tarray.lua基本上没有任何用途:)

    for i=1,10 do
       print(a[i - 1])
    end

    for i=2,10 do

       print(p[i - 1].x)
    end

          OK,现在在命令行下面输入tarray.exe看看效果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    1
    2
    3
    4
    5
    6
    7
    8
    9

          可以看到简单的两个循环遍历C中的变量的效果就这样由lua脚本实现了,很简单,不是么:)

           总结一下使用tolua++的过程:
            1)编写pkg文件生成对应的c\c++文件
            2)分别编译1)产生的文件(注意要加上对应的头文件)和需要使用lua脚本的文件
            3)编写lua脚本,遵从lua的语法并且使用到的变量,函数,类等都是1)中声明过的.

     

    原文地址:

    http://blog.chinaunix.net/uid-22145625-id-3228435.html

  • 相关阅读:
    Spring + MySQL + Mybatis + Redis【二级缓存】执行流程分析
    Spring + MySQL + Mybatis + Redis【二级缓存】
    MyBatis的笔记
    Spring事务:一种编程式事务,三种声明式事务
    笔记
    mybatis-generator自定义注释生成
    做准备的笔记
    常用DOS命令和Linux命令
    数据库MongoDB查询语句--持续更新
    SpringBoot集成websocket实现后端向页面发送消息
  • 原文地址:https://www.cnblogs.com/byfei/p/3112346.html
Copyright © 2011-2022 走看看