windows-lua 应用开发

woodzcl_zhangcl 2017-08-23 06:57:20
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=./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=../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=../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, 可以发邮件跟我索取,邮箱791398105@qq.com
*******

其次, 我们要把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,就到这里了。祝同学们好运。



...全文
284 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
smwhotjay 2017-08-24
  • 打赏
  • 举报
回复
引用 1 楼 ckc 的回复:
有没有lua的web框架什么的
py的web框架一大把,精悍的很,很多app云引擎都有py
这不是鸭头 2017-08-24
  • 打赏
  • 举报
回复
还是python火。
ckc 2017-08-23
  • 打赏
  • 举报
回复
有没有lua的web框架什么的

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧