01:编译lua及C调用

我们今天在windows平台编译lua,生成 lua动态库,lua.exe,luac.exe

我把这个目录上传到giee,使用下面命令获取它:

git clone git@gitee.com:jameschenbo/lua_c_application.git

或者直接访问:访问网页

目录结构如下:

build.cmd 是编译脚本,在执行前我们需要修改里面的gcc路径

我使用的是本地安装好的QT5的编译器

点击运行 build.cmd 等待编译结束,生成lua文件夹

lua/bin/lua.exe 解析器

lua/bin/luac.exe 编译器

lua/bin/lua54.dll 动态库

lua/doc 帮助文档

lua/include 在其他平台使用lua需要包含的头文件

运行示例

进入example目录

运行build.cmd  同样需要更改里面GCC的路径

生成main.exe,执行如下:

c_call_main.c#include "lua/include/lua.h"
#include "lua/include/lualib.h"
#include "lua/include/lauxlib.h"static int clua_add(lua_State* L, int a, int b)
{int sum = 0;/* 函数入栈 */lua_getglobal(L, "add");/* 第一个函数参数入栈 */lua_pushnumber(L, a);/* 第二个函数参数入栈 */lua_pushnumber(L, b);/* 执行函数调用。2表示有两个函数形参,1表示add函数只有一个返回值,调用lua_call函数后lua自动出栈参数和函数,并将函数的执行结果入栈 *//** 执行函数调用* 2表示lua脚本中add函数需要输入两个函数参数* 1表示lua脚本中add函数有一个返回值* 执行完函数调用后,lua自动出栈函数和参数*/lua_call(L, 2, 1);/** 得到函数add函数执行结果* -1表示最后一个返回值,因为lua的函数可以返回多个值的。*/sum = lua_tonumber(L, -1);/* 出栈一个数据。此时栈中存的是add函数的执行结果,所以需要出栈 */lua_pop(L, 1);return sum;
}
/*** 调用lua 函数,传递参数并获取返回值* lua_script/add.lua*/
void example_add(void)
{int sum = 0;lua_State* L;L = luaL_newstate();  /* 创建一个句柄 */luaL_openlibs(L);     /* 打开lua库 */#if 1if(luaL_dofile(L, "./lua_script/add.lua"))  /* 从lua脚本文件 中加载lua脚本语句 */{printf(" load lua script file error! \r\n");return;}
#elseif(luaL_dostring(L, (const char *)"function add(a, b) return a + b end"))  /* 从字符串中加载lua脚本语句 */{printf(" LUA语句有误!\r\n");return -1;}
#endifsum = clua_add(L, 10, 20);printf(" sum = %d \r\n", sum);lua_close(L);  /* 关闭lua,清理内存 */
}void load_config_file(lua_State* L, const char* fname, int *w, int *h)
{if(luaL_loadfile(L, fname) || lua_pcall(L, 0, 0,0)) {printf("load config file error\n");}//1.读变量配置//入栈操作,和出栈操作要对应lua_getglobal(L, "width");lua_getglobal(L, "height");//出栈操作,先压栈的,后出栈if(!lua_isnumber(L, -2)) {printf("width should be number!\n");}if(!lua_isnumber(L, -1)) {printf("height should be number!\n");}//转换数据类型*w = lua_tointeger(L, -2);*h = lua_tointeger(L, -1);//清空栈lua_settop(L, 0);//2.读 table 配置lua_getglobal(L, "sys_table_cfg");//入栈,指定位置lua_getfield(L, -1, "sex");lua_getfield(L, -2, "age");lua_getfield(L, -3, "port");lua_getfield(L, -4, "baud");lua_getfield(L, -5, "isSave");//出栈,和入栈顺序相反printf("sys_table_cfg:\n\n");printf("sex:%s\n",lua_tostring(L, -5));printf("age:%d\n",lua_tointeger(L, -4));printf("port:%s\n",lua_tostring(L, -3));printf("baud:%d\n",lua_tointeger(L, -2));printf("isSave:%d\n",lua_tointeger(L, -1));printf("\n");lua_settop(L, 0);
}
/*** 读取lua格式的配置文件* lua_script/config.lua* 配置文件有全局变量,有表*/
void example_config_file(void)
{lua_State *L = luaL_newstate();luaL_openlibs(L);int w, h;load_config_file(L, "./lua_script/config.lua", &w, &h);printf("width=%d,height=%d\n", w, h);
}
int main(int argc, char* argv[])
{//下面是两个例子选择一个编译执行//// example_add();  //调用lua函数例子,传参和接收返回值example_config_file();//读取lua脚本编写的配置文件例子getchar();return 0;
}		

lua当配置文件使用的脚本 config.lua

--define windows size
print "my application config file (*.lua)!"width = 100height = 80sys_table_cfg = {sex = "male",age = 18,port = "COM1",baud = 9600,isSave = 0
}

lua函数调用脚本 add.lua

function add(a, b) return a + b + 10
end

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

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

相关文章

【离散数学】——期末刷题题库(一阶逻辑基本概念)

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

开发测试利器之Fiddler网络调试工具详细安装使用教程(包含汉化脚本)

一、Fiddler简介 Fiddler 是一款功能强大的网络调试工具,可以帮助开发人员和测试人员分析和调试网络流量。它通过截取计算机和服务器之间的HTTP/HTTPS请求,并提供详细的请求和响应信息来帮助我们理解和诊断网络通信。 Fiddler 可以用于各种用途&#x…

k8s环境排查nginx转发nacos请求失败问题

一、问题背景 k8s部署两个服务,一个nginx,一个nacos, 服务信息如下(nacos有两个端口): 服务 serviceNameservice类型porttargetPort nodePortnginxmonitor-cp-nginxNodePort808031082nacosmonitor-cp-nacosClusterIP88488848-98489848- ng的default.conf配置文件…

给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。

7-5 矩阵运算 分数 20 全屏浏览题目 切换布局 作者 C课程组 单位 浙江大学 给定一个nn的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。 输入格式: 输入第一行给出正整数n(…

获得文件MD5——校验完整性 window 和 Linux下操作

目录 引出window下获得文件MD5Linux下获得文件MD5单个文件整个目录下所有文件检查MD5 总结 引出 1.Windows 10 自带了一个命令行程序 certutil可以 获取文件的 MD5 值; 2.Linux下md5sum命令获得文件MD5值; window下获得文件MD5 Windows 10 自带了一个命…

针对Arrays.asList的坑,可以有哪些处理措施

上文讲述:Error querying database. Cause: java.lang.reflect.InaccessibleObjectException: 那么如果真的只习惯用Arrays.asList,那也是有对应的解决办法的。 一、解决办法大方向 不管做什么事情,都是先判定一个大方向,不管是…

性价比高的护眼灯,好用护眼的护眼台灯推荐

7月27日,2023第七届家居品牌大会在北京启幕,现场发布了“2022—2023家居十大质量事件”,其中“护童、爱果乐齐曝抽检不合格”事件上榜。 在“读写台灯”品类上,本次抽查检验11个省(区、市)84家企业生产的11…

【开源】基于JAVA的天然气工程运维系统

项目编号: S 022 ,文末获取源码。 \color{red}{项目编号:S022,文末获取源码。} 项目编号:S022,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统角色分类2.2 核心功能2.2.1 流程…

Git学习笔记01

一、Git-教程简介 分布式版本控制工具软件git,工具软件就是实现指定功能的应用软件 git用于管理软件开发项目中的源代码文件 1、学习方式 图形演示 操作 2、常用功能 仓库管理、文件管理、分支管理、标签管理、远程操作 3、进阶功能 使用开发工具来集成Git…

程序的机器级表示

程序的机器级表示 有关CSAPP第三章一些我关注到的重点的记录 操作指令 .c->.exe的流程 1.选项 -E : 预编译过程,处理宏定义和include,并作语法检查 gcc -E hello.c -o hello.i #将hello.c预处理输出为hello.i文件2.选项 -S : 编译过程,生成通用…

条形码格式

条形码格式 简述EAN码EAN-13EAN-8 UPC码UPC-AUPC-E 简述 EAN码 EAN码(European Article Number)是国际物品编码协会制定的一种全球通用的商用条码。EAN码分为:标准版(EAN-13) 和 缩短版(EAN-8&#xff09…

“yum history”命令示例,用于显示、回滚、重做、撤消 yum 事务

yum 的“yum history”功能是 Linux 中一个经常被忽视但非常强大的实用程序。它可用于将 yum 事务回滚/重做/撤消到一切正常的状态。 yum history “yum history list”命令在不带任何参数的情况下运行时会产生类似于下图所示的输出。“yum history”或者“yum history list”…

不会提问不打紧,不敢提问才要命

最近在星球里回答了球友提出来的一些问题,我都给了回复,不经过在明确问题、探索问题的过程,对我启发挺大,特此来记录下感受和感悟。 缘起 最近新加入球友提的问题,有几次,我第一时间没看懂,甚…

基于自然语言处理的地铁工程车辆故障智能诊断研究

源自:《兵器装备工程学报》 作者:严硕, 徐永能, 何文韬 “人工智能技术与咨询” 发布 摘要 针对地铁工程车辆故障文本数据未得到合理利用的现象,提出了一种基于自然语言处理的故障智能诊断方法。该方法对故障文本进…

Servlet自定义异常处理类

话不多说,直接上代码。。。 异常处理类GlobalExceptionHandler public class GlobalExceptionHandler {ExceptionHandler(UnknownServiceException.class)public static void UnknownServiceExceptionHandle(Exception ex, HttpServletRequest request, HttpServ…

交流回馈负载的主要工作方式

交流回馈负载是一种电力电子装置,其主要工作方式是将电能从交流电源转换为直流电,然后再将直流电转换为交流电。这种转换过程是可逆的,因此可以用于调节电网的电压和频率,提高能源利用效率,减少能源浪费。 交流回馈负载…

Java(八)(可变参数,Collections,小案例:斗地主游戏小案例:斗地主游戏,Map集合,Stream流)

目录 可变参数 Collections 小案例:斗地主游戏 Map集合 Map的常用方法 map集合的遍历 键找值 键值对 Lambda 表达式 HashMap底层原理 集合的嵌套 Stream流 获取集合或数组的Stream流 Stream流的方法 可变参数 就是一种特殊的形参,定义在方法和构造器的形参列表中,…

小吉和希亦内衣洗衣机选哪个好?小型洗衣机测评对比

在生活质量不断提高的今天,人们对健康、卫生的要求也日益提高。内衣是女性的贴身衣物,它的清洁和卫生是非常重要的。尤其是小孩的衣服,毛巾,袜子等要分开洗,这样就不会和大人的衣服一起洗了,更加的卫生和方…

专业课问题 | 667和972问题集锦

专业课备考问题集锦 表1是我最近收集的667相关问题: 表1 667相关备考问题与简要回答 类型序号问题回答关于背书1整本书已经背了N轮了,后期只可以背诵知识清单吗?背书的总体思路:看书(1-2遍)——>知识清单(N轮循环,掌握90%的知识点)——>看书(1-2遍)2后面五个…

java-netty知识点笔记和注意事项

如何获取ctx的id 使用ctx.ctx.toString()就可以了 public void channelRead(ChannelHandlerContext ctx, Object msg) {//传来的消息包装成字节缓冲区String byteBuf (String) msg; // ByteBuf byteBuf (ByteBuf) msg;//Netty提供了字节缓冲区的toString方法&#xff…