tolua++初探(一)(转)
2010-01-29 10:22
用luaplus试验了下,想把简单的C++类映射到lua脚本中不难,但是复杂一点的,比方说类的聚合、继承等,比较麻烦。我试验了两天,用表中表来实 现是可以的,但自己弄太麻烦了。说到底,我只是想用一下而已,不是想从头弄一个系统。 用CEGUI时发现它用了tolua++,从网上DOWN了源码(1.0.92),支持Lua5.1。我用VS2005,用源码包里的sln顺利编译出 tolua++.exe。lib据说要用第三方的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++.exe,lua5.1.dll,tolua++.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]@Arr,tolua++会分析这一句,将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.lib,tolua++.lib,包含lua.hpp,tolua++.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 第一个例子到此为止。编译后可以进行测试了。 我针对DEBUG和release版本生成了不同的DLL和LIB文件,好用于测试。 总结一下步骤: 1.编写C头文件,定义想导出的对象 2.编写pkg文件,包含之前的C头文件,用tolua++可识别的规则定义你要导出的对象 3.用tolua++.exe生成CPP文件 4.将3生成的文件,1中的头文件,tolua++的头文件,lua的头文件及相关的库加入工程。 5.编写lua脚本文件。 |
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论