英語(yǔ)培訓(xùn)網(wǎng)站模板亞馬遜seo是什么意思
我們今天在windows平臺(tái)編譯lua,生成 lua動(dòng)態(tài)庫(kù),lua.exe,luac.exe
我把這個(gè)目錄上傳到giee,使用下面命令獲取它:
git clone git@gitee.com:jameschenbo/lua_c_application.git
目錄結(jié)構(gòu)如下:
build.cmd 是編譯腳本,在執(zhí)行前我們需要修改里面的gcc路徑
我使用的是本地安裝好的QT5的編譯器
點(diǎn)擊運(yùn)行 build.cmd 等待編譯結(jié)束,生成lua文件夾
lua/bin/lua.exe 解析器
lua/bin/luac.exe 編譯器
lua/bin/lua54.dll 動(dòng)態(tài)庫(kù) lua/doc
lua/include?幫助文檔 在其他平臺(tái)使用編譯器需要包含的頭文件
運(yùn)行示例
進(jìn)入example目錄
運(yùn)行build.cmd? 同樣需要更改里面GCC的路徑
生成main.exe,執(zhí)行如下:
c_call_main.c#include "lua/include/lua.h"
#include "lua/include/lualib.h"
#include "lua/include/lauxlib.h"static int clua_add(lua_State* L, int a, int b)
{int sum = 0;/* 函數(shù)入棧 */lua_getglobal(L, "add");/* 第一個(gè)函數(shù)參數(shù)入棧 */lua_pushnumber(L, a);/* 第二個(gè)函數(shù)參數(shù)入棧 */lua_pushnumber(L, b);/* 執(zhí)行函數(shù)調(diào)用。2表示有兩個(gè)函數(shù)形參,1表示add函數(shù)只有一個(gè)返回值,調(diào)用lua_call函數(shù)后lua自動(dòng)出棧參數(shù)和函數(shù),并將函數(shù)的執(zhí)行結(jié)果入棧 *//** 執(zhí)行函數(shù)調(diào)用* 2表示lua腳本中add函數(shù)需要輸入兩個(gè)函數(shù)參數(shù)* 1表示lua腳本中add函數(shù)有一個(gè)返回值* 執(zhí)行完函數(shù)調(diào)用后,lua自動(dòng)出棧函數(shù)和參數(shù)*/lua_call(L, 2, 1);/** 得到函數(shù)add函數(shù)執(zhí)行結(jié)果* -1表示最后一個(gè)返回值,因?yàn)閘ua的函數(shù)可以返回多個(gè)值的。*/sum = lua_tonumber(L, -1);/* 出棧一個(gè)數(shù)據(jù)。此時(shí)棧中存的是add函數(shù)的執(zhí)行結(jié)果,所以需要出棧 */lua_pop(L, 1);return sum;
}
/*** 調(diào)用lua 函數(shù),傳遞參數(shù)并獲取返回值* lua_script/add.lua*/
void example_add(void)
{int sum = 0;lua_State* L;L = luaL_newstate(); /* 創(chuàng)建一個(gè)句柄 */luaL_openlibs(L); /* 打開(kāi)lua庫(kù) */#if 1if(luaL_dofile(L, "./lua_script/add.lua")) /* 從lua腳本文件 中加載lua腳本語(yǔ)句 */{printf(" load lua script file error! \r\n");return;}
#elseif(luaL_dostring(L, (const char *)"function add(a, b) return a + b end")) /* 從字符串中加載lua腳本語(yǔ)句 */{printf(" LUA語(yǔ)句有誤!\r\n");return -1;}
#endifsum = clua_add(L, 10, 20);printf(" sum = %d \r\n", sum);lua_close(L); /* 關(guān)閉lua,清理內(nèi)存 */
}void load_config_file(lua_State* L, const char* fname, int *w, int *h)
{if(luaL_loadfile(L, fname) || lua_pcall(L, 0, 0,0)) {printf("load config file error\n");}//1.讀變量配置//入棧操作,和出棧操作要對(duì)應(yīng)lua_getglobal(L, "width");lua_getglobal(L, "height");//出棧操作,先壓棧的,后出棧if(!lua_isnumber(L, -2)) {printf("width should be number!\n");}if(!lua_isnumber(L, -1)) {printf("height should be number!\n");}//轉(zhuǎn)換數(shù)據(jù)類(lèi)型*w = lua_tointeger(L, -2);*h = lua_tointeger(L, -1);//清空棧lua_settop(L, 0);//2.讀 table 配置lua_getglobal(L, "sys_table_cfg");//入棧,指定位置lua_getfield(L, -1, "sex");lua_getfield(L, -2, "age");lua_getfield(L, -3, "port");lua_getfield(L, -4, "baud");lua_getfield(L, -5, "isSave");//出棧,和入棧順序相反printf("sys_table_cfg:\n\n");printf("sex:%s\n",lua_tostring(L, -5));printf("age:%d\n",lua_tointeger(L, -4));printf("port:%s\n",lua_tostring(L, -3));printf("baud:%d\n",lua_tointeger(L, -2));printf("isSave:%d\n",lua_tointeger(L, -1));printf("\n");lua_settop(L, 0);
}
/*** 讀取lua格式的配置文件* lua_script/config.lua* 配置文件有全局變量,有表*/
void example_config_file(void)
{lua_State *L = luaL_newstate();luaL_openlibs(L);int w, h;load_config_file(L, "./lua_script/config.lua", &w, &h);printf("width=%d,height=%d\n", w, h);
}
int main(int argc, char* argv[])
{//下面是兩個(gè)例子選擇一個(gè)編譯執(zhí)行//// example_add(); //調(diào)用lua函數(shù)例子,傳參和接收返回值example_config_file();//讀取lua腳本編寫(xiě)的配置文件例子getchar();return 0;
}
lua當(dāng)配置文件使用的腳本 config.lua
--define windows size
print "my application config file (*.lua)!"width = 100height = 80sys_table_cfg = {sex = "male",age = 18,port = "COM1",baud = 9600,isSave = 0
}
lua函數(shù)調(diào)用腳本 add.lua
function add(a, b) return a + b + 10
end