LUA是什么,有多火,我就不多說了:)哈哈哈
lua原生于linux平臺,所以,網上關于Linux下lua的資料很多(安裝,使用)。如果你是在Linux下應用lua開發,那么請上網查詢。
但是,畢竟還有另外一片天地下生活著一群兄弟姐妹們:)哈哈哈
這里,我要介紹,Windows平臺下,你該如何應用lua。
包括,編譯lua原始碼;lua呼叫c-dll;c呼叫lua。
首先,我們講下,原始碼編譯安裝問題。
一 下載
1. 資源在此,http://www.lua.org/ftp/lua-5.3.4.tar.gz
2. 下載完成后,RAR解壓縮,出現lua-5.3.4目錄
3. 在C盤下建立win-lua目錄
4. 將lua-5.3.4目錄下的src目錄整體拷貝至C:\win-lua\, 這個是lua原始碼檔案目錄
5. 在C:\win-lua\下創建out目錄,這個用來存盤稍后我們編譯的lua靜態庫lua.lib,lua.exe,luac.exe,后兩者分別是lua解釋器,lua編譯器
二 編譯
1. 在C:\win-lua\src 同級目錄創建 Makefile檔案
OUT=./out
SRC=https://bbs.csdn.net/topics/src
lua.lib:$(SRC)/loadlib.obj $(SRC)/lua.obj $(SRC)/lcode.obj $(SRC)/lgc.obj $(SRC)/lmathlib.obj \
$(SRC)/lobject.obj $(SRC)/lstrlib.obj $(SRC)/ltm.obj $(SRC)/lutf8lib.obj $(SRC)/lauxlib.obj \
$(SRC)/liolib.obj $(SRC)/ldo.obj $(SRC)/linit.obj $(SRC)/ltable.obj $(SRC)/ldebug.obj \
$(SRC)/lbaselib.obj $(SRC)/lparser.obj $(SRC)/loslib.obj $(SRC)/llex.obj $(SRC)/lcorolib.obj \
$(SRC)/lapi.obj $(SRC)/ltablib.obj $(SRC)/lvm.obj $(SRC)/lstring.obj $(SRC)/ldblib.obj \
$(SRC)/lstate.obj $(SRC)/lbitlib.obj $(SRC)/lundump.obj $(SRC)/ldump.obj $(SRC)/lzio.obj \
$(SRC)/luac.obj $(SRC)/lmem.obj $(SRC)/lopcodes.obj $(SRC)/lctype.obj $(SRC)/lfunc.obj
@lib -out:$(OUT)/$@ *.obj
%.obj:%.c
@cl -Fo $@ -c $<
clean:
@del *.obj
2. 運行nmake,我們將在C:\win-lua\out\下生成lua.lib
3. 在C:\win-lua\下創建 lua目錄,luac目錄
4. 在C:\win-lua\lua\下創建Makefile
OUT=../out
SRC=https://bbs.csdn.net/src
lua.exe:$(SRC)/loadlib.obj $(SRC)/lua.obj $(SRC)/lcode.obj $(SRC)/lgc.obj $(SRC)/lmathlib.obj \
$(SRC)/lobject.obj $(SRC)/lstrlib.obj $(SRC)/ltm.obj $(SRC)/lutf8lib.obj $(SRC)/lauxlib.obj \
$(SRC)/liolib.obj $(SRC)/ldo.obj $(SRC)/linit.obj $(SRC)/ltable.obj $(SRC)/ldebug.obj \
$(SRC)/lbaselib.obj $(SRC)/lparser.obj $(SRC)/loslib.obj $(SRC)/llex.obj $(SRC)/lcorolib.obj \
$(SRC)/lapi.obj $(SRC)/ltablib.obj $(SRC)/lvm.obj $(SRC)/lstring.obj $(SRC)/ldblib.obj \
$(SRC)/lstate.obj $(SRC)/lbitlib.obj $(SRC)/lundump.obj $(SRC)/ldump.obj $(SRC)/lzio.obj \
$(SRC)/lmem.obj $(SRC)/lopcodes.obj $(SRC)/lctype.obj $(SRC)/lfunc.obj
@link -out:$(OUT)/$@ *.obj
%.obj:%.c
@cl -Fo $@ -c $<
clean:
@del *.obj
5. 運行nmake,我們我們將在C:\win-lua\out\下生成lua.exe
6. 在C:\win-lua\luac\下創建Makefile
OUT=../out
SRC=https://bbs.csdn.net/src
luac.exe:$(SRC)/loadlib.obj $(SRC)/lcode.obj $(SRC)/lgc.obj $(SRC)/lmathlib.obj \
$(SRC)/lobject.obj $(SRC)/lstrlib.obj $(SRC)/ltm.obj $(SRC)/lutf8lib.obj $(SRC)/lauxlib.obj \
$(SRC)/liolib.obj $(SRC)/ldo.obj $(SRC)/linit.obj $(SRC)/ltable.obj $(SRC)/ldebug.obj \
$(SRC)/lbaselib.obj $(SRC)/lparser.obj $(SRC)/loslib.obj $(SRC)/llex.obj $(SRC)/lcorolib.obj \
$(SRC)/lapi.obj $(SRC)/ltablib.obj $(SRC)/lvm.obj $(SRC)/lstring.obj $(SRC)/ldblib.obj \
$(SRC)/lstate.obj $(SRC)/lbitlib.obj $(SRC)/lundump.obj $(SRC)/ldump.obj $(SRC)/lzio.obj \
$(SRC)/luac.obj $(SRC)/lmem.obj $(SRC)/lopcodes.obj $(SRC)/lctype.obj $(SRC)/lfunc.obj
@link -out:$(OUT)/$@ *.obj
%.obj:%.c
@cl -Fo $@ -c $<
clean:
@del *.obj
7. 運行nmake,我們我們將在C:\win-lua\out\下生成luac.exe
好了,到此,你就獲得了windows平臺上lua的基礎構件
*******
有些同學可能對命令列編譯不太熟悉,但這個問題已經超出了本文的討論范圍,我們在此不解釋。
如果有同學需要windows平臺上的lua.lib lua.exe luac.exe, 可以發郵件跟我索取,郵箱[email protected]
*******
其次, 我們要把lua安裝到Windows
這個程序比較簡單,首先我不會給大家做個安裝包來使用的
我們需要的只是在windows環境變數上(PATH)加入我們的lua工具所在目錄,就可以保證lua環境可用。
具體就是在系統Path變數上添加C:\win-lua\out 目錄
好了,到此,你的Windows下已經有了lua環境了。
你可以試試啟動cmd,看看如下效果
lua
>print("hello world")
hello world
>
你看到了嗎?
看到了,好,恭喜,你成功配置了windows下的lua環境。
然后,我們開始開發作業了
預處理:請下載安裝vs2017,在工程環境里配置好鏈接lua.lib靜態庫, 附加包含目錄里寫上lua原始碼里的頭檔案路徑(本文位置:C:\win-lua\src)。這個是windows VC開發人員必備技能,此處不再多說。
demo1: lua 呼叫C語言寫的dll庫
//請選擇WIN32動態庫空模板,添加lua-c.c檔案
/*lua-c.c*/
#include <stdio.h>
#include <stdlib.h>
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
int add(lua_State* L)
{
double op1 = luaL_checknumber(L, 1);
double op2 = luaL_checknumber(L, 2);
lua_pushnumber(L, op1+op2);
return 1;
}
int sub(lua_State* L)
{
double op1 = luaL_checknumber(L, 1);
double op2 = luaL_checknumber(L, 2);
lua_pushnumber(L, op1-op2);
return 1;
}
static luaL_Reg mylibs[] = {
{"add", add},
{"sub", sub},
{NULL, NULL}
};
_declspec(dllexport) int luaopen_mytestlib(lua_State* L)
{
lua_newtable(L);
luaL_setfuncs(L, mylibs, 0);
return 1;
}
編譯此工程,將生成的動態庫改名為 mytestlib.dll
創建 lua腳本檔案,別介意,lua就是腳本啊:)哈哈哈
--filename:main.lua
local clib = require "mytestlib"
print(clib.add(1.0, 2.0))
print(clib.sub(20.1, 19))
必須保證main.lua 和 mytestlib.dll在同一目錄下,我這里本身就在同一目錄下
打開cmd, 看看效果
lua ./main.lua
3.0
1.1
看到了嗎?
看到了!
好,你成功實作了lua腳本呼叫c-dll庫了。
解釋一下 demo1: c-dll 提供了兩個C介面函式(加法操作,減法操作),通過luaopen_mytestlib函式注冊在lua腳本環境中。
關于注冊請查閱lue語言的lua_newtable和luaL_setfuncs介面,這個內容太多,請大家自己補足知識。
多說一下,如果只是應用開發,那么你我的demo1做模板來書寫你自己的c-dll也足夠了。
luaL_checknumber函式介面是取lua腳本傳遞給c-dll介面里引數的,有幾個引數,就呼叫幾次這個函式介面獲
得引數
lua_pushnumber函式介面負責把計算結果回傳給lua腳本
好了,demo1,就到這里了。祝同學們好運。
************************************************************************************************************************************************
demo2:C工程里呼叫lua腳本
//請選擇WIN32控制臺模板,添加lua-c.c檔案
/*lua-c.c*/
#include <stdio.h>
#include <stdlib.h>
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
/* call a function 'f' defined in Lua */
double f(lua_State* L, double x, double y)
{
double z;
lua_getglobal(L, "f");
lua_pushnumber(L, x);
lua_pushnumber(L, y);
/* do the call (2 arguments, 1 result) */
if (lua_pcall(L, 2, 1, 0) != 0)
{
printf("error running function 'f': %s", lua_tostring(L,-1));
}
if (!lua_isnumber(L, -1))
{
printf("function 'f' must return a number");
}
z = lua_tonumber(L, -1);
lua_pop(L, 1);
return z;
}
void main(void)
{
lua_State* L = luaL_newstate();
luaL_openlibs(L);
if (luaL_loadfile(L, "lua-func.lua")||lua_pcall(L, 0, 0, 0))
{
printf("luaL_dofile exception, %s\n",lua_tostring(L, -1));
}
double ret = f(L, 2, 13);
printf("f's retvalue:%lf\n", ret);
}
編譯此工程,將生成lua-c.exe程式
創建 lua腳本檔案
--filename:lua-func.lua
function f (x, y)
return (x^2 * math.sin(y))/(1 - x)
end
必須保證lua-func.lua 和lua-c.exe在同一目錄下,我這里本身就在同一目錄下
打開cmd, 看看效果
lua-c.exe
f's retvalue:-1.680668
看到了嗎?
看到了!
好,你成功實作了C語言程式腳本呼叫lua腳本了。
解釋一下 demo2: luaL_loadfile函式介面裝載要執行的lua腳本檔案。lua_getglobal函式介面取得要使用的腳本函式。
lua_pushnumber函式介面給腳本函式傳遞引數。lua_tonumber函式介面取得腳本函式回傳值。
好了,demo2,就到這里了。祝同學們好運。
uj5u.com熱心網友回復:
有沒有lua的web框架什么的uj5u.com熱心網友回復:
還是python火。uj5u.com熱心網友回復:
py的web框架一大把,精悍的很,很多app云引擎都有py
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/89681.html
標籤:基礎類
