当前位置: 首页 > news >正文

lua移植及使用

编译环境:Ubuntu16.04 64位
交叉编译工具:arm-hisiv500-linux-gcc

文章目录

  • 1. 项目背景
  • 2. lua开源版本选择
  • 3. 封装代码
    • 3.1 源码简介
    • 3.2 封装类
      • 3.2.1 头文件
      • 3.2.2 类的实现
      • 3.3.3 sample代码

1. 项目背景

使用lua脚本,读取key对应的值,用作设备的默认配置。

2. lua开源版本选择

使用lua-5.4.6.tar.gz点击下载,早期使用lua-5.0.2.tar.gz,在部分平台上存在浮点运算错误的问题,放弃。

3. 封装代码

3.1 源码简介

源码的目录结构比较简单,只有一个src目录,Makefile略作修改即可,或者根据自己项目做简化。
lua.hpp文件内容如下,外部调用主要用到就是这三个头文件,在编译C++工程时注意extern “C”:

// lua.hpp
// Lua header files for C++
// <<extern "C">> not supplied automatically because Lua also compiles as C++extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}

3.2 封装类

3.2.1 头文件

#ifndef __LUA_CONFIG_H__
#define __LUA_CONFIG_H__#include <string>
#include <pthread.h>struct lua_State;
typedef struct lua_State lua_State;class LuaConfig
{
public:static int Initialize(void);static int Invalidate(void);static LuaConfig* instance(void);
private:static LuaConfig* s_instance;LuaConfig(void);virtual ~LuaConfig(void);LuaConfig(LuaConfig &);			// 拷贝构造函数,禁止拷贝public:int Init(const char * filename);//要解析的lua文件,可以按照lua语法包含其他luavoid unInit();///< 根据传入的键值返回相应的字符串///< key为要访问的键值///< defaultValue为默认值,当访问的键值不存在时返回std::string getString(const char * key, const char * defaultValue="");///< 根据传入的键值返回相应的double值,与getString类似///< key为要访问的键值///< defaultValue为默认值,当访问的键值不存在时返回double getNumber(const char * key, double defaultValue = 0);private:int TravelTable(const char * key);private:lua_State *m_luastate;pthread_mutex_t m_Mutex;
};#endif //__LUA_CONFIG_H__

3.2.2 类的实现

#include "LuaConfig.h"
#include <string.h>
#include <stdlib.h>extern "C"
{#include "lua/lua.h"#include "lua/lauxlib.h"#include "lua/lualib.h"
};int LuaConfig::Initialize(void)
{if(s_instance != NULL)return -1;s_instance = new LuaConfig;return 0;
}
int LuaConfig::Invalidate(void)
{if(s_instance == NULL)return 0;delete s_instance;return 0;
}
LuaConfig* LuaConfig::instance(void)
{return s_instance;
}LuaConfig* LuaConfig::s_instance = NULL;LuaConfig::LuaConfig()
{m_luastate = NULL;pthread_mutex_init(&m_Mutex, NULL);
}LuaConfig::~LuaConfig()
{unInit();pthread_mutex_destroy(&m_Mutex);
}int LuaConfig::Init(const char * filename)
{if (m_luastate != NULL)return -1;if (filename == NULL)return -2;
#if 0 // 5.0.2的封装m_luastate = lua_open();if (m_luastate == NULL)return -3;luaopen_base(m_luastate);luaopen_table(m_luastate);luaopen_io(m_luastate);luaopen_string(m_luastate);luaopen_math(m_luastate);luaopen_debug(m_luastate);//luaopen_lfs(m_luastate);//luaopen_bitlib(m_luastate);if (lua_dofile(m_luastate, filename) != 0)return -4;
#else//5.4.6m_luastate = luaL_newstate();if (m_luastate == NULL)return -3;luaL_openlibs(m_luastate);if (luaL_dofile(m_luastate, filename) != 0)return -4;
#endifreturn 0;
}void LuaConfig::unInit()
{if (m_luastate != NULL){lua_close(m_luastate);m_luastate = NULL;}return;
}std::string LuaConfig::getString(const char * key, const char * defaultValue)
{pthread_mutex_lock(&m_Mutex);int nTop   = lua_gettop(m_luastate);int status = TravelTable(key);std::string ret = defaultValue;if( (status == 0) && (lua_isstring(m_luastate, -1))){ret = lua_tostring(m_luastate, -1);}lua_settop(m_luastate, nTop);pthread_mutex_unlock(&m_Mutex);return ret;
}double LuaConfig::getNumber(const char * key, double defaultValue)
{pthread_mutex_lock(&m_Mutex);int nTop   = lua_gettop(m_luastate);int status = TravelTable(key);double ret = defaultValue;if( (status == 0) && (lua_isnumber(m_luastate, -1))){ret = lua_tonumber(m_luastate, -1);}lua_settop(m_luastate, nTop);pthread_mutex_unlock(&m_Mutex);return ret;
}int LuaConfig::TravelTable(const char * key)
{// 创建匿名函数int len = strlen(key) + 16;char* szFunc = (char*)malloc(len);memset(szFunc, 0, len);sprintf(szFunc, "return %s", key);int status = luaL_loadbuffer(m_luastate, szFunc, strlen(szFunc), "table_travel");if(status == 0){status = lua_pcall(m_luastate, 0, LUA_MULTRET, 0);}free(szFunc);return status;
}

3.3.3 sample代码

LuaConfig::Initialize();
LuaConfig* pCfg = LuaConfig::instance();
pCfg->Init("./test.lua");int testA = (int)LuaConfig::instance()->getNumber("testA", 0);
std::string testB = LuaConfig::instance()->getString("testB", "123456");if (pCfg != NULL)
{pCfg->unInit();LuaConfig::Invalidate();
}

以上。
转载请注明出处,如有错漏之处,敬请指正。

相关文章:

lua移植及使用

编译环境&#xff1a;Ubuntu16.04 64位 交叉编译工具&#xff1a;arm-hisiv500-linux-gcc 文章目录 1. 项目背景2. lua开源版本选择3. 封装代码3.1 源码简介3.2 封装类3.2.1 头文件3.2.2 类的实现3.3.3 sample代码 1. 项目背景 使用lua脚本&#xff0c;读取key对应的值&#x…...

【鸿蒙软件开发】ArkTS基础组件之Select(下拉菜单)、Slider(滑动条)

文章目录 前言一、Select下拉菜单1.1 子组件1.2 接口参数 1.3 属性1.4 事件1.5 示例代码 二、Slider2.1 子组件2.2 接口参数&#xff1a;SliderStyle枚举说明 2.3 属性2.4 事件SliderChangeMode枚举说明 2.5 示例代码 总结 前言 Select组件&#xff1a;提供下拉选择菜单&#…...

linux ssh 免密登录

概述 在大数据测试环境搭建时&#xff0c;经常会用到 ssh 免密登录 &#xff0c;方便机器之间分发文件&#xff0c;从一个机器上登录至其它机器也方便 如何配置 linux 的 ssh 免密登录? 非免密登录 端口是22 [rootKS8P-Test-K8S06 ~]# ssh KS8P-Test-K8S06端口非22 [roo…...

秒级启动的集成测试框架

本文介绍了一种秒级启动的集成测试框架&#xff0c;使用该框架可以方便的修改和完善测试用例&#xff0c;使得测试用例成为测试过程的产物。 背景 传统的单元测试&#xff0c;测试的范围往往非常有限&#xff0c;常常覆盖的是一些工具类、静态方法或者较为底层纯粹的类实现&…...

Redux 数据仓库

Redux 数据仓库 解决React 数据管理&#xff08;状态管理&#xff09; &#xff0c;用于中大型&#xff0c;数据比较庞大&#xff0c;组件之间数据交互多的情况下使用。 作者&#xff1a;如果你不知道是否需要使用Redux,那么你就不需要它&#xff01; 解决组件的数据通信。 …...

[毕设记录]@开题调研:一些产品

我感觉产品能代表落地的一些实际应用&#xff0c;会和研究的角度有些差别&#xff0c;但是需求和兴趣往往是从现实中来的&#xff0c;在上一篇blog里面看外国blog的时候顺着搜搜到了很多国外的智慧校园chatbot解决方案 文章目录 Comm100streebomodern campusUniBuddy Comm100 …...

CSS3中的字体和文本样式

CSS3优化了CSS 2.1的字体和文本属性&#xff0c;同时新增了各种文字特效&#xff0c;使网页文字更具表现力和感染力&#xff0c;丰富了网页设计效果&#xff0c;如自定义字体类型、更多的色彩模式、文本阴影、生态生成内容、各种特殊值、函数等。 1、字体样式 字体样式包括类…...

LVS集群-DR模式【部署高可用LVS-DR集群】

文章目录 2.2 实战&#xff1a;配置LVS-DR集群2.2.1 配置IP&#xff08;Director Server的部署配置&#xff09;2.2.2 生成ens33:1配置文件 &#xff08;Director Server的部署配置&#xff09;2.2.3 配置LVS-DR规则&#xff08;Director Server的部署配置&#xff09;2.2.4 两…...

银河麒麟服务器版v4安装程序缺少依赖包,改为利用手机联网在线安装

1 将安卓手机连接使用usb转typec线连接到服务器的usb口。&#xff08;linux桌面版&#xff09;也可以类似的方法手机联网。 2 在手机热点中打开usb共享 3 使用ifconfig命令找到手机被服务器识别成的网卡名 4 使用dhclient “手机网卡名”命令&#xff0c;使服务器能上网。 5 变…...

Maven第一章:Maven安装、验证、使用

Maven第一章:Maven安装、验证、使用 前言 谁适合阅读本教程? Java开发人员:Maven是Java项目管理和构建工具,因此对Java开发人员来说是一个重要的工具。阅读Maven知识可以帮助他们更好地理解如何使用Maven来管理Java项目,包括依赖管理、构建自动化、项目构建和部署等。项目…...

ios 代码上下文截屏之后导致的图片异常问题

业务场景&#xff0c;之前是直接将当前的collectionview截长屏操作&#xff0c;第一次截图会出现黑色部分原因是视图未完全布局&#xff0c;原因是第一次使用了Masonry约束然后再截图的时候进行了frame赋值&#xff0c;可以查看下Masonry约束和frame的冲突&#xff0c;全部修改…...

《嵌入式软\硬件开发难点-2023-10-29》

一、《嵌入式软件开发难点》 内存有限、螺蛳壳里做道肠&#xff1b;处理能力有限&#xff0c;必须做好规划&#xff0c;榨取系统每一份处理能力&#xff1b;现代开发工具和实际工具难实施&#xff0c;资源问题&#xff1a;C/Python/Java&#xff1b;调试跟踪问题较困难&#x…...

基于5G工业CPE打造智慧煤矿无人巡检监测应用

煤炭是我国重要的能源资源&#xff0c;对于煤炭的开采和利用也是我国重要的工业产业部分。得益于5G物联网技术的发展普及&#xff0c;煤矿场景也迎来智能化升级&#xff0c;实现了包括智能采掘、智能调度、无人运输、无人巡检等新型应用&#xff0c;极大提升了煤矿采运产业的效…...

考点之数据结构

概论 时间复杂度和空间复杂度是计算机科学中用来评估算法性能的重要指标。 时间复杂度&#xff1a; 时间复杂度衡量的是算法运行所需的时间。它表示算法执行所需的基本操作数量随着输入大小的增长而变化的趋势。 求法&#xff1a; 通常通过分析算法中基本操作执行的次数来…...

07、SpringCloud -- jmeter 压测

目录 jmeter 入门jmeter 安装测试步骤测试数据模拟多用户操作1、创建http请求2、添加http cookie 管理器3、并发获取当前登录用户数据的效果4、添加多个用户模拟并发请求5、访问方法6、jmeter添加 CSV Data Set Config7、高并发执行访问的效果8、总结流程高并发秒杀压测jmeter …...

省市区三级联动查询redis(通过python脚本导入数据)

最近工作有一个工作需求是实现省市区联动&#xff0c;点击省下拉框&#xff0c;选中一个省&#xff0c;然后再选市&#xff0c;最后选区&#xff0c;当然最重要的首先自然是数据了&#xff0c;没数据怎么测试接口&#xff0c;我数据是在 https://hxkj.vip/demo/echartsMap/ 这里…...

Linux命令(108)之dirname

linux命令之dirname 1.dirname介绍 linux命令dirname是用来获取文件的指定路径 2.dirname用法 dirname [参数] NAME dirname参数 参数说明-z使用NUL而不是换行符分隔输出--help查看帮助信息--version查看版本信息 3.实例 3.1.获取文件的指定路径 命令&#xff1a; dirn…...

SDL事件处理以及线程使用(2)

事件使用 #include <stdio.h> #include <SDL.h>#define FF_QUIT_EVENT (SDL_USEREVENT 1) // 定义自定义事件#undef main int main() {SDL_Window* pWindow NULL;SDL_Init(SDL_INIT_VIDEO);// 创建窗口pWindow SDL_CreateWindow("Event Test Title&…...

DAY38 动态规划 + 509. 斐波那契数 + 70. 爬楼梯 + 746. 使用最小花费爬楼梯

动态规划理论 动态规划&#xff0c;Dynamic Programming&#xff0c; DP&#xff0c; 如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点就区分于贪心&#xff0c;贪心没有状态推导…...

Redis快速上手篇七(集群-一台虚拟机六个节点)

​​​​​​http://t.csdnimg.cn/S0NpK与上篇六个虚拟机配置基本一样有不懂可以看上篇配置实例 集群搭建 根据上篇文章&#xff0c;本篇只着重于小方面的配置差别 配置集群一般不要设置密码 1.搭建一台虚拟机后再安装目录下新建文件夹 redis_cluster 2.在文件夹内创建六个文…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化

iOS 应用的发布流程一直是开发链路中最“苹果味”的环节&#xff1a;强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说&#xff0c;这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发&#xff08;例如 Flutter、React Na…...

C/Python/Go示例 | Socket Programing与RPC

Socket Programming介绍 Computer networking这个领域围绕着两台电脑或者同一台电脑内的不同进程之间的数据传输和信息交流&#xff0c;会涉及到许多有意思的话题&#xff0c;诸如怎么确保对方能收到信息&#xff0c;怎么应对数据丢失、被污染或者顺序混乱&#xff0c;怎么提高…...