tolua++初探(一)()
2010-01-29 10:22
luaplus试验了下,想把简单的C++类映射到lua脚本中不难,但是复杂一点的,比方说类的聚合、继承等,比较麻烦。我试验了两天,用表中表来实 现是可以的,但自己弄太麻烦了。说到底,我只是想用一下而已,不是想从头弄一个系统。    CEGUI时发现它用了tolua++,从网上DOWN了源码(1.0.92),支持Lua5.1。我用VS2005,用源码包里的sln顺利编译出 tolua++.exelib据说要用第三方的scons来弄,嫌麻烦,我直接建了个VC动态库工程,将src\lib下的文件加进来,修改了 tolua++.h,重定义一下TOLUA_API,编译通过。
#ifndef TOLUA_API
#ifdef _WINDLL
#define TOLUA_API __declspec(dllexport)
#else
#definesystem的头文件 TOLUA_API extern
#endif
#endif
    这只是个简单的定义,如果在其它的DLL中用tolua++.h会出问题(我直接用了_WINDLL宏来判断),自己定义一个其它的宏就可以了。      我要用动态链接库,不想用静态库。下了lua5.1.3的源码包,编译动态库。      编译时都选择MD,不选MT,后者在项目中有多个模块时容易出问题,尤其是有的模块用MD,有的模块用MT时更容易出问题。我那天就因为这个出了400多个错误,几乎抓狂。      这样我现在有了tolua++.exelua5.1.dlltolua++.dll,以及对应的lib文件。可以进行试验了。
tolua++初探(二)()
2010-01-29 10:23
tolua++的源码包中有很多测试例子。这里我用更最简单的例子来学习。   

第一个例子是数组。仅仅是把C++中的一个数组导出到Lua中,可以在脚本中访问并修改。   

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]@Arrtolua++会分析这一句,将g_Arr[10]映射到lua中的Arr上。其中@后面是你想在lua中看到的变量名。   

tarray.h文件也只有一句:
#ifndef _TESTARRAY_H
#define _TESTARRAY_H
extern int g_Arr[10];
#endif
    g_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文件加入工程。    在工程中加入lua5.1.libtolua++.lib,包含lua.hpptolua++.h,然后写点测试代码,就可以编译了。

程序主文件array.cpp:
#include "stdafx.h"
#include "lua.hpp"
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, "..\scripts\array.lua");
    printf("now in c++, re-show Arr: ");
    for(i=0; i<10; i++)
        printf("%d ", g_Arr[i]);
    printf(" ");
    lua_close(L);
    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
    第一个例子到此为止。编译后可以进行测试了。    我针对DEBUGrelease版本生成了不同的DLLLIB文件,好用于测试。

总结一下步骤:   
1.编写C头文件,定义想导出的对象   
2.编写pkg文件,包含之前的C头文件,用tolua++可识别的规则定义你要导出的对象   
3.tolua++.exe生成CPP文件   
4.3生成的文件,1中的头文件,tolua++的头文件,lua的头文件及相关的库加入工程。   
5.编写lua脚本文件。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。