tolua++快速入門

工程師WWW發表於2013-11-29

tolua++使用SCons進行編譯,我們也可以使用自己喜歡的IDE新建一個控制檯(Console)工程,然後將原始碼下bin目錄中所有檔案加入到工程中,直接編譯即可;同樣地,新建一個靜態庫(StaticLibrary)工程,將原始碼下lib目錄中所有檔案加入進入,編譯即可。當然了,這些工程是需要lua庫支援的,目前tolua++最新版本是1.0.93,支援lua5.1.x。

 

經過上面的步驟,在Windows系統上的話,你會得到tolua++.exe和tolua.lib,前者是一個輔助工具,用來將.pkg檔案(下面將會講到)轉換成原始碼,而後者則是我們需要在自己工程中加入的函式庫。

 

下面開始正式使用tolua++。

一開始,我們並不需要特別注意,按照自己的需要來撰寫完完全全的C++程式碼,假設我們有一個基於控制檯的專案,名為mytest,設定好專案屬性,包含必要的庫(包括lua和tolua++),新增如下程式碼:// file: UsingIt.h

#include<iostream>

 

classmy_class

{

public:

    void greet()

    {

        std::cout << “Hello World!” << std::endl;

    }

};

 

 

 

好,下面撰寫我們的.pkg檔案:// file: mylib.pkg

$pfile“UsingIt.h”

 

classmy_class

{

    my_class();

    ~my_class();

 

    void greet();

};

 

 

 

 

還記得我們的tolua++.exe嗎?是時候派上用場了: > tolua++ -n mylib -o mylib.cpp mylib.pkg

 

 

 

這條命令的意思是:使用tolua++程式,從mylib.pkg生成原始碼並輸出到mylib.cpp,而-n引數則是用來指定包名稱的(lua 中package name)。你會得到mylib.cpp,檔案,其中包含一個很重要的函式:int tolua_<package name>_open(lua_State*)。"packagename”就是用-n指定,這裡就是int tolua_mylib_open(lua_State*),它的功能就是將你在.pkg檔案中所撰寫的類、函式介面等註冊給lua,這個函式是需要你自己呼叫的。

 

回到我們的mytest專案,將上面得到的mylib.cpp檔案加入到專案中,新增一個新檔案Main.cpp://file: Main.cpp

#include<iostream>

#include<tolua++.h>

extern“C” {

#include"lua.h"

#include"lauxlib.h"

}

#include“UsingIt.h”

 

intmain()

{

    lua_State* L = lua_open();

    luaL_openlibs(L);

 

    tolua_mylib_open(L); // 開啟mylib

    luaL_dofile(L, “mytest.lua”); // 執行指令碼檔案

 

    lua_close(L);

    return 0;

}

 

 

 

mytest.lua指令碼檔案內容:

localmy = my_class()

my:greet()

 

 

 

好了,編譯並執行你的mytest程式吧,你將看到 Hello World! 出現在你的螢幕上!

 

就說到這裡了,更深入的使用請參考tolua++的文件,有一點需要注意的是,tolua++並不支援匯出虛擬函式類供lua程式碼派生實現。但是這一點並非不可克服,後面我們會講到該如何解決。

 

 

 

使用tolua++實現虛擬函式

 

前面我撰寫了一篇《tolua++快速入門》,介紹瞭如何邁入tolua++的使用大門。這次,我們來談點高階的東西:使用虛擬函式。

 

本文來源於實際專案經驗,但技術要點則是基於一篇文章:《Implementing VirtualMethods With Toluapp》。

 

具體的使用方法,你可以詳細閱讀該文,請注意該文後面的一段:

Someversions of tolua++ (like 1.0.92) have problems with the'default_private_access' flag. If the methods on your virtual class are notbeing exported, try setting the flag to false. You'll have to add a private:label to the class declarations that have private stuff by default at thebeginning.

 

該說明適用於tolua++最新版本1.0.93,所以,你需要在實際使用中做相應調整。

另外一個需要注意的則是名字空間,如果你在.pkg中使用了名字空間:

namespacemylib

{

    class A {…};

    class B : public A {…};

}

在匯出類有虛擬函式的情況下匯出的程式碼是無法通過編譯的,因為在額外匯出程式碼函式中會加入名字空間限定,這個可以通過手工移除該限定來解決,但每次匯出都這樣你肯定會覺得煩!我的建議是將namespacemylib替換為module mylib,然後在匯出原始碼中加入using namespace mylib;。聰明的你甚至可以在.pkg中加入一個額外的標頭檔案來避免每次匯出都需要增加這行程式碼,完美!