主頁 > 軟體工程 > windows-lua 應用開發

windows-lua 應用開發

2020-09-20 15:15:57 軟體工程

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熱心網友回復:

參考 1 樓 ckc 的回復:
有沒有lua的web框架什么的

py的web框架一大把,精悍的很,很多app云引擎都有py

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/89681.html

標籤:基礎類

上一篇:Oracle 未找到提供程式 該程式可能未正確安裝

下一篇:vs2010 mfc ActiveX控制元件包容類中無屬性修改方法

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more