tolua++快速入門
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中加入一個額外的標頭檔案來避免每次匯出都需要增加這行程式碼,完美!
相關文章
- 快速排序快速入門排序
- 自學前端如何快速入門?怎麼快速入門前端?前端
- SQL快速入門 ( MySQL快速入門, MySQL參考, MySQL快速回顧 )MySql
- MySQL 快速入門MySql
- mysqlsla快速入門MySql
- Pipenv 快速入門
- Envoy 快速入門
- mongodb快速入門MongoDB
- Spark 快速入門Spark
- zookeeper 快速入門
- MQTT 快速入門MQQT
- Lumen快速入門
- Webpack快速入門Web
- RabbitMQ快速入門MQ
- QT快速入門QT
- makefile快速入門
- CSS快速入門CSS
- Markdown快速入門
- Docker快速入門Docker
- mybatis快速入門MyBatis
- Nginx快速入門Nginx
- TypeScript快速入門TypeScript
- TypeScript 快速入門TypeScript
- phpunit 快速入門PHP
- Zookeeper快速入門
- pipenv快速入門
- Thymeleaf【快速入門】
- WebSocket 快速入門Web
- React快速入門React
- vim快速入門
- JavaScript快速入門JavaScript
- 快速入門reactReact
- Express快速入門Express
- GitHub 快速入門Github
- Vue快速入門Vue
- Allure快速入門
- SprinMvc快速入門MVC
- Postman快速入門Postman