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