三、cocos是如何将c++类导出到lua的?

来源:互联网 发布:与制工作室长板淘宝 编辑:程序博客网 时间:2024/06/05 14:14

cocos使用tolua++将c++类暴露给lua,下面是tolua++的使用介绍。


tolua++的工作原理!

1、tolua++是使用c语言、利用lua提供的的c api编写的一个程序,这个程序解析一个声明了需要导出的类的文本文件,生成一个C++代码文件。

2、我们将生成的代码文件加入到自己的工程中,并调用其中的一个接口函数,就可以将我们定义的类暴露给lua了!


如何使用tolua++!

1、编译tolua++,得到tolua.exe和静态库tolua.lib

2、定义我们需要导出的类test.cpp和test.h,并编写一个main函数

3、使用tolua.exe,根据test.h生成一个c++代码文件

4、在工程中包含这个代码文件,并在程序中调用其中的接口函数


详细的步骤!

1、下载tolua++,安装相应版本的lua

2、打开tolua++里面win32文件夹,用vs打开里面的sln

3、配置工程的.h和.lib包含目录,以包含lua

4、编译生成tolua.exe

5、新建一个静态库工程

6、将tolua根目录里面的src/lib里面的代码文件添加到工程

7、添加lua的lib,配置以便找到lua的头文件

8、编译生成tolua.lib

9、新建一个测试工程,包含的文件有:

main.cpp

// 包含pkg文件生成的tolua.cpp文件需要的tolua代码!#pragma comment(lib,"libproject.lib")// 包含需要的lua代码用来解析lua文件!#pragma comment(lib,"lua5.1.lib")// 下面是一个正常的包含lua的程序!#include <iostream>using namespace std;extern "C"{#include "lua.h"#include "lualib.h"#include "lauxlib.h"}// 这个函数在tolua.cpp中实现的,但是tolua没有生成相应的头文件,我们需要自己申明一下!// 这个函数完成了将cpp类暴露给lua!int tolua_cpp_open(lua_State*);int main(){lua_State* L = lua_open();luaL_openlibs(L);// 暴露pkg中定义的类到lua!tolua_cpp_open(L);luaL_dofile(L, "test.lua");lua_close(L);return 0;}

test.cpp

#include "test.h"#include <iostream>void my_class::greet( char * _str,int _cnt){for( int i = 0; i < _cnt; ++ i){std::cout << _str << std::endl;}}my_class::my_class(){}my_class::~my_class(){}


test.h

class my_class{public:my_class();~my_class();    void greet(char*,int);};

tolua_wrapper.cpp

/*tolua生成的文件没有包含test.h,如果我们直接修改生成的tolua.cpp,则每次重新生成都需要进行修改,而且vs还会提醒重新载入,很麻烦,所以用这个cpp文件包装一下生成的tolua.cpp!*/#include "test.h"// 这是tolua生成的cpp文件,里面有一个函数可以将pkg里面的类导出到lua中!#include "tolua.cpp"



10、在测试工程的源码目录新建test.pkg文件

class my_class{public:my_class();~my_class();    void greet(char*,int);};


11、新建tolua.bat文件,当然你需要保证可以找到你的tolua.exe

tolua.exe -n cpp -o tolua.cpp test.pkg

tolua生成的接口函数名称和-n有关,如果是XXX,则接口函数为tolua_XXX_open

-o是输出文件名,随意;最后是输入文件名

12、运行tolua.bat生成tolua.cpp

13、编写测试用的lua脚本文件test.lua

local t = my_class()t:greet( ":)", 3)


你应该看到lua打印出了三个笑脸!


你可以下载测试工程:

http://pan.baidu.com/s/1eQrFafg


0 0
原创粉丝点击