如何编写lua扩展库

很多人都听过lua,也见过lua脚本,但可能不理解为什么lua脚本里面会有这么多没见过的函数,

而且这些函数功能是如此强大,能上天入地,无所不能

其实这些函数并不是lua自带的,都是由程序作者造出来的隐藏在了他们的主程序里

一般运行lua脚本,我们会使用自带的解释器,当你拿到一份lua源码后,编译出来的就是lua

比如我编写了一个lua脚本

复制代码
--hello.lua

print("hello")

在linux下运行则是lua hello.lua

会打印出hello的字样

初学lua的一般就卡在这一步了,因为没有更多的功能可以写,一翻手册发现也没几个api,也不知道如何嵌入到自己的程序中,就算能使用lua运行外部脚本,也达不到文章开头所描述的那种效果

lua这门语言很有意思,它只提供了一些基本的语法和系统库功能,其它功能都没有,但有一个很强大的特性,就是可以通过很简单的方式,扩展功能

请看如下代码common.c

复制代码
#include <unistd.h>
#include "lua.h"
#include "lauxlib.h"


static int lua_sleep(lua_State*l)
{
    size_t sleepTime=luaL_checkinteger(l,1);
    usleep(sleepTime*1000);
    return 0;
}

LUALIB_API int luaopen_common(lua_State *l) {
  trace("luaopen_common()\n");
  luaL_Reg reg[] = {
    {"msleep",lua_sleep},
    { NULL, NULL }
  };
  lua_newtable(l);
  luaL_setfuncs(l, reg, 0);
  lua_pushliteral(l, "Lua common");
  lua_setfield(l, -2, "_NAME");
  lua_pushliteral(l, "0.1");
  lua_setfield(l, -2, "_VERSION");
  trace("luaopen_common() done\n");
  return 1;
}

以上代码是一个最基本的lua扩展库,使用c语言开发的,只需要gcc -rdynamic -fPIC common.c -o libcommon.so 即可

编译出来之后,我们就可以通过这个库为lua增加功能了,在这段代码里面,我编写了一个common库,

只有一个功能msleep

如何使用这个库呢,看看以下的hello.lua代码

复制代码
--设置动态库搜索目录,如在lib/x64下任意的libxxx.so,可以指定多个目录,用分号隔开
package.cpath = package.cpath .. ";lib/x64/lib?.so"..";lib/arm/lib?.so"

local common=require("common")

while true do
    print("hello")
    common.msleep(1000)
end

在lua代码的目录下创建一个目录lib/x64,将刚才编译的库放到里面

运行代码 lua hello.lua

你就会看到程序每隔1秒打印一行hello

如果想更进一步,那就需要自己编写更多类似于msleep这样的功能了

之后写代码就不需要编译了,只需要切换lua文件就能替换程序功能,贼棒

相关推荐
CHEN5_02几秒前
【Java基础】反射,注解,异常,Java8新特性,object类-详细介绍
java·开发语言
Cx330❀13 分钟前
【数据结构初阶】--排序(四):归并排序
c语言·开发语言·数据结构·算法·排序算法
云间月131417 分钟前
飞算JavaAI智慧文旅场景实践:从景区管理到游客服务的全链路系统搭建
java·开发语言
杜子不疼.35 分钟前
《Python学习之使用标准库:从入门到实战》
开发语言·python·学习
意疏39 分钟前
【C语言篇】srand函数的详细用法解析
c语言·开发语言
艾莉丝努力练剑1 小时前
【C语言16天强化训练】从基础入门到进阶:Day 1
c语言·开发语言·数据结构·学习
颖川守一1 小时前
C++c6-类和对象-封装-设计案例2-点和圆的关系
开发语言·c++
飞剑神2 小时前
qt svg缺失元素, 原因是不支持 rgba
开发语言·qt
诗书画唱2 小时前
【前端面试题】JavaScript 核心知识点解析(第二十二题到第六十一题)
开发语言·前端·javascript
冬天vs不冷2 小时前
Java基础(九):Object核心类深度剖析
java·开发语言·python