Lua語言被不少大軟件作為腳本語言,因?yàn)橥ㄟ^Lua語言吓笙,可以很方便地調(diào)用大型程序中的已有函數(shù)己儒,這樣可以將業(yè)務(wù)邏輯與算法邏輯分離開陕习。我們也可以在自己的軟件中,嵌入lua語言址愿,預(yù)留API給用戶做更多的自定義操作(如腳本編輯器)该镣。本文談Lua源碼的編譯、以及如何在自己的C程序中嵌入Lua响谓。
有正在學(xué)習(xí)Lua的朋友损合,可以進(jìn)Q群121811911下載軟件資料和視頻,我們一起進(jìn)步娘纷。
編譯Lua
在Lua官網(wǎng)的http://www.lua.org/download.html頁面嫁审,可以下載到各個(gè)版本的Lua源碼。源碼的結(jié)構(gòu)分為以下幾個(gè)目錄:
doc:文檔
etc:方便學(xué)習(xí)的lua源碼赖晶,是工程級(jí)別的lua的子集律适,含Makefile
source:lua源代碼辐烂,含Makefile
test:一些Lua腳本,用于測試
根據(jù)源文件生成Lua捂贿,最終的結(jié)果有幾種選擇:
Lua library:靜態(tài)的Lua庫纠修,這樣,配合Lua的頭文件厂僧,就可以將Lua嵌入到自己的程序中了
Standalone Lua:Lua解釋器扣草,可以讀取Lua腳本并執(zhí)行
Luac:lua編譯器,將Lua腳本翻譯成Lua字節(jié)碼颜屠,這樣可以加快Lua腳本的加載速度
源碼附帶的Makefile辰妙,沒有針對(duì)Windows VS平臺(tái)的選項(xiàng)。不過不用擔(dān)心甫窟,自己根據(jù)需要密浑,建個(gè)空工程,再把各個(gè)文件添加進(jìn)去粗井,就可以編譯成功了尔破。其中l(wèi)uac與lua需要建立的是控制臺(tái)空工程,靜態(tài)庫需要建立的是靜態(tài)庫空工程(鏈接方式不一樣)背传。
嵌入Lua
編譯好lualib后呆瞻,就可以配合頭文件台夺,在自己的C++程序中調(diào)用Lua了径玖,以下是一個(gè)簡單例子,它加載并執(zhí)行一個(gè)Lua腳本"hello,lua":
extern "C" {
#include "LuaHeader/lua.h"
#include "LuaHeader/lualib.h"
#include "LuaHeader/lauxlib.h"
}
int main(int argc, char *argv[])
{
int s = 0;
lua_State *L = lua_open();
// load the libs
luaL_openlibs(L);
//run a Lua scrip here
luaL_dofile(L, "hello.lua");
lua_close(L);
return 1;
}
因?yàn)長ua是C語言寫的颤介,為了鏈接正常梳星,注意要extern "C"。以下是hello.lua腳本的內(nèi)容滚朵,它也可以修改為其它符合lua語法的腳本:
io.write("Please enter your name: ")
name = io.read()
io.write("Hi " .. string.format("%s",name) .. ", enjoy hacking with Lua\r\n");
用Lua中調(diào)用host程序的函數(shù)
lua常被選為各大程序的內(nèi)嵌腳本語言的原因冤灾,就是它可以將host program的函數(shù),注冊為API供lua調(diào)用辕近,這樣可以使編程的邏輯易于調(diào)整韵吨。以下是一個(gè)特別簡單的例子:
// function type must be lua_CFunction
extern "C" static int MYAPI_ShowHello(lua_State *L)
{
printf("Hello, World\r\n");
return 1;
}
int main(int argc, char *argv[])
{
int s = 0;
lua_State *lua = lua_open();
// load the libs
luaL_openlibs(lua);
// register C function into lua
lua_pushcclosure(lua, MYAPI_ShowHello, 0);
lua_setglobal(lua, "myHello");
//run a Lua scrip here
luaL_dofile(lua, "hello.lua");
lua_close(lua);
return 1;
}
通過以上pushcclosure與setglobal的注冊,在lua中可以通過調(diào)用"myHello"來間接調(diào)用host程序的MYAPI_ShowHello函數(shù)移宅。
"hello.lua"中的內(nèi)容:
myHello()
更多的內(nèi)容归粉,需要學(xué)習(xí)Lua的API。也可以進(jìn)Q群121811911下載軟件資料和視頻漏峰。