tolua++的源码包中有很多测试例子。这里我用更最简单的例子来学习。
第一个例子是数组。仅仅是把C++中的一个数组导出到Lua中,可以在脚本中访问并修改。
tarray.pkg文件:
很简单,$#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文件也只有一句:
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:
luaopen_tarray_open是必须要调用的,tolua++.exe根据你命令行中指定的名字生成tolua_**_open函数。该函数用 来导出c++对象到lua脚本中,所以必须在你执行lua脚本之前调用。函数的原型在由tolua++.exe生成的cpp文件中。
脚本文件array.lua内容如下:
第一个例子到此为止。编译后可以进行测试了。 我针对DEBUG和release版本生成了不同的DLL和LIB文件,好用于测试。
总结一下步骤:
1.编写C头文件,定义想导出的对象
2.编写pkg文件,包含之前的C头文件,用tolua++可识别的规则定义你要导出的对象
3.用tolua++.exe生成CPP文件
4.将3生成的文件,1中的头文件,tolua++的头文件,lua的头文件及相关的库加入工程。
5.编写lua脚本文件。
第一个例子是数组。仅仅是把C++中的一个数组导出到Lua中,可以在脚本中访问并修改。
tarray.pkg文件:
$#include "tarray.h"

extern int g_Arr[10]@Arr;


extern int g_Arr[10]@Arr;
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

#define _TESTARRAY_H


extern int g_Arr[10];


#endif
用tolua++.exe生成用于导出c++对象到lua脚本中的CPP文件:

程序主文件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;
}


#include "lua.hpp"


int tolua_tarray_open (lua_State* tolua_S);


#include "tarray.h"




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;
}
脚本文件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

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