如何编写lua扩展库

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

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

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

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

比如我编写了一个lua脚本

--hello.luaprint("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 doprint("hello")common.msleep(1000)
end

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

运行代码  lua  hello.lua

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/105494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VMware _ Ubuntu _ root 密码是什么,怎么进入 root 账户

文章目录 进入 root 账户设置 root 密码小结 在 VMware 安装 ubuntu 虚拟机之后&#xff0c;root 用户的密码是什么&#xff1f;安装的过程也没有提示输入 root 用户的密码&#xff0c;只有创建第一个非 root 用户的密码。但是 root 用户是存在的&#xff0c;又怎么切换到 root…

红帽Linux的安装和部署

目录 一、红帽Linux的安装阶段 1、下载redhat7.9的iso镜像 2、安装阶段 二、红帽Linux的配置阶段 1、第一次进入装机配置 2、进入机器后的一些配置 三、远程连接阶段 1、关闭防火墙 2、使用Xshell远程连接&#xff08;其他连接工具也行&#xff09; 1.开启SSH服务 2.连…

利达卓越:关注环保事业,持续赋能科技

随着全球环境问题的日益突出,绿色金融作为一种新兴的金融模式逐渐受到各国的重视。绿色金融是指在金融活动中,通过资金、信贷和风险管理等手段,支持环境友好和可持续发展的项目和产业。绿色金融的出现是为了应对气候变化、资源短缺、污染问题等现实挑战,促进经济的绿色转型和可…

基于海洋捕食者优化的BP神经网络(分类应用) - 附代码

基于海洋捕食者优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于海洋捕食者优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.海洋捕食者优化BP神经网络3.1 BP神经网络参数设置3.2 海洋捕食者算法应用 4…

Delay-Based 拥塞控制算法

上班七天了&#xff0c;有点崩溃&#xff0c;看一篇论文提神&#xff1a;A Delay-Based Approach for Congestion Avoidance in Interconnected Heterogeneous Computer networks&#xff0c;来自 Raj Jain&#xff0c;1989 年。这篇论文基于下图展开&#xff1a; 是不是很熟…

SiC外延片测试方案

外延材料是实现器件制造的关键&#xff0c;主要技术指标有外延层厚度、晶格布局&#xff0c;材料结构&#xff0c;形貌以及物理性质&#xff0c;表面粗糙度和掺杂浓度等。下面阐述SiC外延表面常见的测试手段&#xff1a; 1. 外延层厚度&#xff08;傅里叶变换红外FT-IR&#xf…

SpringBoot通过配置切换注册中心(多注册中心nacos和eureka)

场景&#xff1a; 因项目需要&#xff0c;一个springcloud微服务工程需要同时部署到A,B两个项目使用&#xff0c;但A项目使用Eureka注册中心&#xff0c;B项目使用Nacos注册中心&#xff0c;现在需要通过部署时修改配置来实现多注册中心的切换。 解决思路&#xff1a; 如果同时…

Eslint配置 Must use import to load ES Module(已解决)

最近在配置前端项目时&#xff0c;eslint经常会碰到各种报错&#xff08;灰常头疼~&#xff09; Syntax Error Error No ESLint configuration found.Syntax Error: Error: D:\dmq\dmq-ui.eslintrc.js: Environment key “es2021” is unknown at Array.forEach ()error in ./…

UE4 快速入门 1

安装 https://www.unrealengine.com/zh-CN/download Launcher ue4.23 editor visual studio 2019 社区版 文档学习

IO流:java中解码和编码出现乱码说明及代码实现

IO流&#xff1a;java中解码和编码的代码实现 一、UTF-8和GBK编码方式二、idea和eclipse的默认编码方式三、解码和编码方法四、代码实现编码解码 五、额外知识扩展 一、UTF-8和GBK编码方式 如果采用的是UTF-8的编码方式&#xff0c;那么1个英文字母 占 1个字节&#xff0c;1个…

Qt QMultiMap

QMultiMap 文章目录 QMultiMap摘要QMultiMapQMultiMap 特点代码示例 关键字&#xff1a; Qt、 QMultiMap、 容器、 键值、 键值重复 摘要 今天在观摩小伙伴撸代码的时候&#xff0c;突然听到了QMultiMap自己使用Qt开发这么就&#xff0c;竟然都不知道&#xff0c;所以趁没…

git cherry-pick命令

问题场景&#xff1a; 需要把dev分支的代码&#xff0c;合并到master分支中&#xff0c;但是又不能根据整个分支合并&#xff0c;所有使用cherry-pick命令&#xff0c;根据提交的commit号来合并 问题描述&#xff1a; 原因分析&#xff1a; 解决方案&#xff1a; 1.在dev分支…

代码随想录

前言 代码随想录算法训练营day37 一、Leetcode 968.监控二叉树 v 1.题目 给定一个二叉树&#xff0c;我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。 计算监控树的所有节点所需的最小摄像头数量。 示例 1&#xff1a; 输入&…

【Python】Python语言基础(上)

第一章 前言 1. Python简介 Python语言并不是新的语言&#xff0c;它早于HTTP 1.0协议5年&#xff0c;早于Java语言 4年。 ​ Python是由荷兰人Guido van Rossum&#xff08;吉多范罗苏姆&#xff09;于1989年圣诞节期间在阿姆斯特丹休假时为了打发无聊的假期而编写的一个脚本…

车载电子电器架构 —— 国产基础软件现在与未来

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的人和事&#xff0c;多看一眼都是你的不…

bash: /usr/bin/cmake: No such file or directory

问题描述 当在linux 下 源码安装 cmake &#xff0c;验证安装 cmake --version&#xff0c; 出现以下错误&#xff1a; bash: /usr/bin/cmake: No such file or directory 解决方法&#xff1a; 将编译生成的 cmake 复制到 /usr/bin 文件夹下 cp ./cmake-3.x/bin/cmake …

idea自动封装方法

例如 package com.utils;import java.lang.reflect.Field; import java.sql.*; import java.util.ArrayList; import java.util.List; import java.util.ResourceBundle;/*** author hrui* date 2023/10/13 13:49*/ public class DBUtils {private static ResourceBundle bund…

华为云云耀云服务器L实例评测|华为云耀云服务器L实例docker部署及应用(七)

八、华为云耀云服务器L实例docker、docker-compose安装及部署MySQL、Redis应用&#xff1a; 随着云原生、容器化、微服务、K8S等技术的发展&#xff0c;容器 docker 也逐渐在企业团队实践中大量的使用。它可以提供了一套标准化的解决方案&#xff0c;极大地提升了部署、发布、运…

2023年中国视频流媒体行业发展历程及趋势分析:未来市场规模趋于平稳[图]

随着移动通信的发展和视频内容产业供给端的繁荣&#xff0c;流媒体视频平台已经成为互联网用户上网时长最长的应用之一。在线视频行业经历了十几年的规范发展阶段&#xff0c;在各大头部平台百花齐放的现状下&#xff0c;难以实现一家独大&#xff0c;但部分平台有领先优势&…

acwing算法基础之基础算法--整数离散化算法

目录 1 知识点2 模板 1 知识点 整个范围很大&#xff0c;但存在的数据点很少。比如从 − 1 0 9 -10^9 −109到 1 0 9 10^9 109&#xff0c;但总共只有 1 0 6 10^6 106个数。 可以采用离散化的思想来做&#xff0c;即将离散的大数值映射成连续的小数值&#xff08;一般是 1 , …