新聞中心
1.簡(jiǎn)介

Lua與C/C++結(jié)合是很緊密的, Lua與C++交互是建立在Lua與C的基礎(chǔ)上的, 所以偶先從Lua與C講起.
正如***講所說(shuō), 運(yùn)行Lua程序或者說(shuō)調(diào)用Lua主要有兩種方式:
* 通過(guò)命令行執(zhí)行"Lua"命令
* 通過(guò)Lua的C庫(kù)
雖然此前偶們一直用***種方式, 但偶要告訴你, 通過(guò)Lua的C庫(kù)執(zhí)行才是游戲中常用的方式.
2.Lua的C庫(kù)
Lua的C庫(kù)可以做為Shared Library調(diào)用, 但一般開(kāi)發(fā)游戲時(shí)會(huì)把Lua的所有源程序都包含在內(nèi), 并不把Lua編譯成共享庫(kù)的形式. 因?yàn)長(zhǎng)ua程序只有100多K, 而且?guī)缀蹩梢栽谌魏尉幾g器下Clean Compile. 帶Lua源程序的另一個(gè)好處時(shí), 可以隨時(shí)對(duì)Lua本身進(jìn)行擴(kuò)充, 增加偶們所需的功能.
Lua的C庫(kù)提供一系列API:
* 管理全局變量
* 管理tables
* 調(diào)用函數(shù)
* 定義新函數(shù), 這也可以完全由C實(shí)現(xiàn)
* 垃圾收集器Garbage collector, 雖然Lua可以自動(dòng)進(jìn)行, 但往往不是立即執(zhí)行的,所以對(duì)實(shí)時(shí)性要求比較高的程序, 會(huì)自己調(diào)用垃圾收集器
* 載入并執(zhí)行Lua程序, 這也可以由Lua自身實(shí)現(xiàn)
* 任何Lua可以實(shí)現(xiàn)的功能, 都可以通過(guò)Lua的C API實(shí)現(xiàn), 這對(duì)于優(yōu)化程序的運(yùn)行速度有幫助. 經(jīng)常調(diào)用的共用的Lua程序片斷可以轉(zhuǎn)成C程序, 以提高效率. 連Lua都是C寫(xiě)的還有什么C不能實(shí)現(xiàn)呢?
3.Lua與C集成的例子
例e10.c
- /* A simple Lua interpreter. */
- #include
- #include
- int main(int argc, char *argv[]) {
- char line[BUFSIZ];
- lua_State *L = lua_open(0);
- while (fgets(line, sizeof(line), stdin) != 0)
- lua_dostring(L, line);
- lua_close(L);
- return 0;
- }
編譯
Linux/Cygwin
* 先編譯Lua, 并把頭文件放入include路徑
* gcc e10.c -llua -llualib -o e10
VC6/VC2003
* 先編譯Lua, 在Option中設(shè)置頭文件和庫(kù)文件路徑
* 新建工程,在工程配置中加入附加庫(kù)lua.lib和lualib.lib
* 編譯成exe
運(yùn)行結(jié)果
本程序的功能是實(shí)現(xiàn)一個(gè)Lua解釋器, 輸入的每行字符都會(huì)被解釋成Lua并執(zhí)行.
程序說(shuō)明
* #include 包含lua頭文件, 然后才可以使用API
* lua_State *L = lua_open(0) 打開(kāi)一個(gè)Lua執(zhí)行器
* fgets(line, sizeof(line), stdin) 從標(biāo)準(zhǔn)輸入里讀入一行
* lua_dostring(L, line) 執(zhí)行此行
* lua_close(L) 關(guān)閉Lua執(zhí)行器
例e11.c
- /* Another simple Lua interpreter. */
- #include
- #include
- #include
- int main(int argc, char *argv[]) {
- char line[BUFSIZ];
- lua_State *L = lua_open(0);
- lua_baselibopen(L);
- lua_iolibopen(L);
- lua_strlibopen(L);
- lua_mathlibopen(L);
- while (fgets(line, sizeof(line), stdin) != 0)
- lua_dostring(L, line); lua_close(L); return 0; }
運(yùn)行結(jié)果
本程序的功能是實(shí)現(xiàn)一個(gè)Lua解釋器, 輸入的每行字符都會(huì)被解釋成Lua并執(zhí)行.
與上例不同的是, 本例調(diào)用了Lua的一些標(biāo)準(zhǔn)庫(kù).
程序說(shuō)明
* #include 包含Lua的標(biāo)準(zhǔn)庫(kù)
* 以下這幾行是用來(lái)讀入Lua的一些庫(kù), 這樣偶們的Lua程序就可以有更多的功能.
lua_baselibopen(L);
lua_iolibopen(L);
lua_strlibopen(L);
lua_mathlibopen(L);
4.試試看
把上面兩個(gè)小例子在你熟悉的編譯器中編譯執(zhí)行, 并試試能否與Lua源碼樹(shù)一起編譯
網(wǎng)站欄目:通過(guò)例子學(xué)習(xí)Lua(5)—Lua與C交互入門(mén)
網(wǎng)頁(yè)URL:http://www.dlmjj.cn/article/dphjepc.html


咨詢(xún)
建站咨詢(xún)
