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配置文件…

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

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

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

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 流程…

程序的机器级表示

程序的机器级表示 有关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…

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

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

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

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

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

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

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

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

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

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

Android 虚拟机与类加载机制

1、Dalvik 虚拟机 Android 应用程序运行在 Dalvik/Art 虚拟机上,并且每一个应用程序都有一个单独的 Dalvik/Art 虚拟机实例。 1.1 JVM 与 Dalvik Dalvik 虚拟机也算是一个 Java 虚拟机,它是按照 JVM 虚拟机规范实现的,二者的特性差不多&am…

机器人制作开源方案 | 网球自动拾取机

作者:柳文浩、李浩杰、苏伟男、贾思萌、张天芸 单位:西安外事学院 指导老师:胡宝权、陈小虎 1. 产品说明 1.1 设计目的 近年来,网球运动越来越受到老百姓的欢迎,各种规模的比赛层出不穷。然而由于网球运动极为激烈…

Python3基础

导包 在 python 用 import 或者 from...import 来导入相应的模块。 将整个模块(somemodule)导入,格式为: import somemodule 从某个模块中导入某个函数,格式为: from somemodule import somefunction 从某个模块中导入多个函数,格式为&#…

C++基础 -4- C/C++混合编程

引用格式(图片代码段呈现) extern "C" {#include "string.h" }代码验证 (分别使用了C/C 的标准输出) #include "iostream"using namespace std;extern "C" { #include "stdio.h" #include "…

Win11修改用户名(超详细图文)

新买的电脑一般预装Windows11系统(家庭与学生版),新电脑初次开机使用微软邮箱账号登录,则系统将用户名自动设置成邮箱前5位字符。我的用户名便是一串数字【231xx】(qq邮箱前5位),看着很不舒服&a…

属性级情感分析

笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ 属性级情感分析 简介数据集介绍数据加载和预处理(data_utils.py)预训练模型(skep)模型定义模块(model.py)训练配置(config.py&am…

element 的 Notification 通知,自定义内容

通知事件: // 商户后台通知 MerchantBackgroundNotice() {// 禁止消息通知弹出多条if(this.notifyInstance) {this.notifyInstance.close();}const h this.$createElement; // 创建文本节点this.notifyInstance this.$notify({showClose: false, // 禁止关闭按钮…