• 如何编写lua扩展库


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

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

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

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

    比如我编写了一个lua脚本

    1. --hello.lua
    2. print("hello")

    linux下运行则是lua   hello.lua

    会打印出hello的字样

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

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

    请看如下代码common.c

    1. #include <unistd.h>
    2. #include “lua.h”
    3. #include ”lauxlib.h“
    4. static int lua_sleep(lua_State*l)
    5. {
    6. size_t sleepTime=luaL_checkinteger(l,1);
    7. usleep(sleepTime*1000);
    8. return 0;
    9. }
    10. LUALIB_API int luaopen_common(lua_State *l) {
    11. trace("luaopen_common()\n");
    12. luaL_Reg reg[] = {
    13. {"msleep",lua_sleep},
    14. { NULL, NULL }
    15. };
    16. lua_newtable(l);
    17. luaL_setfuncs(l, reg, 0);
    18. lua_pushliteral(l, "Lua common");
    19. lua_setfield(l, -2, "_NAME");
    20. lua_pushliteral(l, "0.1");
    21. lua_setfield(l, -2, "_VERSION");
    22. trace("luaopen_common() done\n");
    23. return 1;
    24. }

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

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

    只有一个功能msleep

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

    1. --设置动态库搜索目录,如在lib/x64下任意的libxxx.so,可以指定多个目录,用分号隔开
    2. package.cpath = package.cpath .. ";lib/x64/lib?.so"..";lib/arm/lib?.so"
    3. local common=require("common")
    4. while true do
    5. print("hello")
    6. common.msleep(1000)
    7. end

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

    运行代码  lua  hello.lua

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

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

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

  • 相关阅读:
    C语言-存储期2.0
    基于RockyLinux8.7一键安装OpenStack Yoga版本
    网络工程师——2024自学
    STM32时钟系统
    如何一键核实验证身份证的真伪?
    lua学习
    opencv python 相机启动慢问题 VideoCapture 感觉c++同理
    计算机专业毕业论文安卓毕业设计源码基于Uniapp+Springboot实现的患者服药提醒APP[包运行成功]
    minio文件上传
    【Linux杂货铺】调试工具gdb的使用
  • 原文地址:https://blog.csdn.net/kof98765/article/details/133760040