lua是一個指令碼語言,它的編譯器非常簡單。一般而言,lua在遊戲裡面使用得比較多。它可以通過類似於指令碼的形式把函數的功能串列起來,實現很多不可思議的效果。現在關於lua的資料比較少,主要有兩個文檔可以介紹一下。一個是雲風翻譯的lua手冊,另外一本就是lua作者編寫的《Programming in lua》。可是很多朋友看完了這兩本資料之後還是不太清楚該怎麼使用。今天乘著有空,可以把自己的一些使用經驗來寫一寫。 我們可以把lua看成是lib庫,在使用的時候把這個lib添加到自己的工程裡面就可以了。這裡介紹的方法是windows下用code::blocks編譯lua的方法,因為code::blocks是跨平台的,linux下編譯方法也差不過。
(1)下載lua工程,為http://www.lua.org/ftp/,可以選擇一個比較新的版本,太舊的版本文法不一樣,我選擇的是最新的lua-5.2.1.tar.gz);
(2)在code::blocks中建立一個Dynameic Link Library工程,名為lua_dll。將(1)中下載的檔案解壓到工程路徑下,並在工程中添加src下的檔案;
(3)將lua.c中的main函數修改為lua_main,將luac.c中的main函數修改為luac_main;
(4)編譯後產生lua_dll.dll;
(5)再建立一個Console application工程,名為Test_lua
(6)選擇工程後->Build options,Linker settings->link librarys中添加 lua_dll.dll,在Search directiories -> Compiler 中添加 lua 的原始碼目錄,如(D:\lua-5.2.1\src);
(7)在main.c中編輯代碼:
#include <stdio.h>#include "lua.h"#include "lualib.h"#include "lauxlib.h"#include "luaconf.h"int main(int argc, char* argv[]){ lua_State* L = luaL_newstate(); luaL_openlibs(L); luaL_dofile(L, "D:\\__Development\\C\\delve\\Test_lua\\test.lua"); lua_close(L); return 0;}
(8)此時,我們還需要建立test.lua檔案,內容如下,
function show() local b = {} local index for index = 1,10,1 do print(index) endendshow()
(9)編譯執行後,輸出1,2,3,4,5,6,7,8,9,10就表示成功了。
這樣就結束了嗎?沒有,我們目前做的是編一個lib,然後其他工程中使用這個lib來執行lua,我們也可以直接用lua 的原始碼加入項目來編譯。
(1)建立Console application工程,名為Test_lua_with_src;
(2)把lua的src檔案夾複製到工程下面,並更名src為lua_src;
(3)在工程中添加lua_src目錄(Add files recursively... );
(4)將lua.c中的main函數修改為lua_main,將luac.c中的main函數修改為luac_main;
(5)main.c中與上面差不多,只是修改一下標頭檔路徑,注意test.lua的位置。
#include <stdio.h>#include "lua_src/lua.h"#include "lua_src/lualib.h"#include "lua_src/lauxlib.h"#include "lua_src/luaconf.h"
(5)直接編譯即可
第二種方法可以更方便的修改lua自身的代碼來擴充lua,也不需要建立工程的時候添加lib和.h路徑。
--------------------------------------------------------------------------------------------------------------
上面的代碼只是執行了一個lua程式,與lua進行互動,參考一個測試代碼;
#include <stdio.h>#include "lua_src/lua.h"#include "lua_src/lualib.h"#include "lua_src/lauxlib.h"#include "lua_src/luaconf.h"int main(int argc, char *argv[]) {char buff[256]; int error; lua_State* L = luaL_newstate(); luaL_openlibs(L); //luaopen_base(L); //luaopen_table(L); //luaopen_io(L); //luaopen_string(L); //luaopen_math(L); //printf("xxxx\n"); while (fgets(buff, sizeof(buff), stdin) != NULL) { error = luaL_loadbuffer(L, buff, strlen(buff),"line") || lua_pcall(L, 0, 0, 0); if (error) { fprintf(stderr, "%s", lua_tostring(L, -1)); lua_pop(L, 1); } } lua_close(L); return 0;}
執行後,可直接輸入lua的語句,例如:print(1+2) ,返回結果為3.
更詳細的關於lua的請查閱其他資料,http://blog.csdn.net/zhangjingyangguang/article/details/5221691這裡有一些。