01:编译lua及C调用

news2024/11/24 20:35:47

我们今天在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 1
	if(luaL_dofile(L, "./lua_script/add.lua"))  /* 从lua脚本文件 中加载lua脚本语句 */
	{
		printf(" load lua script file error! \r\n");
		return;
	}
#else
	if(luaL_dostring(L, (const char *)"function add(a, b) return a + b end"))  /* 从字符串中加载lua脚本语句 */
	{
		printf(" LUA语句有误!\r\n");
		return -1;
	}
#endif

	sum = 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 = 100

height = 80

sys_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.coloradmin.cn/o/1258030.html

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

相关文章

美女骑士开箱VELO Angel TT,银色天使,无痛骑行

阳光、女孩、自行车,脸上的笑容或明媚,或神秘,或青涩,在这个时候,世界上没有什么比骑行女孩更美的了!      在北京,有一个热爱骑行的女孩,名叫季思铭,目前是中国农业…

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

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

案例说法:智能网联车背后的安全隐患

随着汽车智能化、网联化的发展,汽车数据处理能力日益增强,未经授权对个人信息和重要数据采集、利用等数据安全问题逐步凸显。对车辆网络攻击、网络侵入等网络安全问题恐将危及个人生命安全、合法权益,甚至危害公共利益、国家安全,…

【活动回顾】sCrypt在柏林B2029开发者周

B2029 是柏林的一个区块链爱好者、艺术家和建设者聚会,学习、讨论和共同构建比特币区块链地方。 在2023年6月9日至11日,举行了第7次Hello Metanet研讨会。本次研讨会旨在为参与者提供一个学习、讨论和共同构建比特币区块链的平台。 在这个充满激情和创意…

js moment时间范围拿到中间间隔时间

2023.11.27今天我学习了如何对只返回的开始时间和结束时间做处理,比如后端返回了: [time:{start:202301,end:202310}] 我们需要把中间的间隔渲染出来。 [202301,202302,202303,202304,202305,202306,202307,202308,202309,202310] 利用moment的add进…

图解算法数据结构-LeetBook-树03_层序遍历奇数偶数行方向不同

一棵圣诞树记作根节点为 root 的二叉树,节点值为该位置装饰彩灯的颜色编号。请按照如下规则记录彩灯装饰结果: 第一层按照从左到右的顺序记录 除第一层外每一层的记录顺序均与上一层相反。即第一层为从左到右,第二层为从右到左。 示例 1&…

需要更改你的Apple ID吗?你可以在iPhone上管理它!一文教你如何更改Apple ID

你的iCloud帐户用于将你的数据存储在苹果的云存储服务中。它还连接到你的Apple ID,该ID用于使用iPhone和iPad进行在线购买。更改你的联系信息、发货地址和Apple ID密码很容易。 如何在iPhone和iPad上更改你的Apple ID联系信息 你可以在iPhone或iPad上更改你的姓名、电子邮件…

【数据库】MongoDB 简介:一种文档数据库

MongoDB 简介:一种文档数据库 1.MongoDB 介绍2.MongoDB 数据存储方式3.MongoDB 概念与操作3.1 Create Operations3.2 Read Operations3.3 Update Operations3.4 Delete Operations 4.MongoDB 特点5.MongoDB 应用场景 1.MongoDB 介绍 MongoDB 是一个基于分布式文件存…

Node——Node.js简介

Node.js是一个基于Chrome V8引擎的JavaScript运行时环境,它能够让JavaScript脚本运行在服务端,这使得JavaScript成为与PHP、Python等服务端语言平起平坐的脚本语言。 1、认识Node.js Node.js是当今网站开发中非常流行的一种技术,它以简单易…

Eureka简单使用做微服务模块之间动态请求

创建一个eureka模块,引入eureka 为启动项加上EnableEurekaServer注解 配置信息 orderService和userService的操作是一样的 这里以orderService为例: 引入eureka客户端 加上 LoadBalanced注解 配置 orderService和userService都配置好了之后 启动 这样我们在http://localhos…

Matplotlib画图接口_Python数据分析与可视化

Matplotlib画图接口 导入matplotlib显示图像画图接口 导入matplotlib 和numpy,pandas一样,在导入matplotlib时我们也可以用一些常用的简写形式: import matplotlib as mpl import matplotlib.pyplot as pltpyplot是最常用的画图模块接口,功…

KaiwuDB 亮相中国 5G + 工业互联网大会,助力新型工业化

11月19-21日,由各相关政府部门共同主办的“2023 中国 5G工业互联网大会”在湖北武汉盛大举行。作为我国“5G工业互联网”领域的国家级顶会,本届大会以“数实融合,大力推进新型工业化”为主题,聚焦新型基础设施、产业转型升级、技术…

麒麟V10服务器搭建FTP服务

概念 1.1介绍 FTP:File transfer protocol 文件传输协议 1.2原理 默认采用被动模式 被动模式FTP 为了解决服务器发起到客户的连接的问题,人们开发了一种不同的FTP连接方式。这就是所谓的被 动方式,或者叫做PASV,当客户端通…

计算机组成原理-Cache替换算法

文章目录 总览随机算法(RAND)先进先出算法(FIFO)近期最少使用算法(LRU)最不经常使用算法(LFU)总结 总览 随机算法(RAND) 没有选择性地考虑替换哪一块Cache&a…

Glare or Gloom, I Can Still See You – End-to-End Multi-Modal Object Detection

SENSOR-AWARE MULTI-MODAL FUSION G-log(-log(U)),U~Uniform[0,1] 辅助信息 作者未提供代码

解密Spring Cloud微服务调用:如何轻松获取请求目标方的IP和端口

公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享。 目的 Spring Cloud 线上微服务实例都是2个起步,如果出问题后,在没有ELK等日志分析平台,如何确定调用到了目标服务的那个实例,以此来排…

深度学习笔记《一》:keras_core.layers.Conv2D()

一、说明 卷积,池化,激活函数,这三者号称是深度神经网络的三驾马车;其中卷积是最复杂的一个,因此,对卷积这个东西需要精心认知,这样对后面学习大有帮助。本篇为系列博文,专门介绍Cer…

哈希表、哈希冲突解决办法

文章目录 一、什么是哈希表?二、什么是哈希冲突?怎样解决?三、哈希表的大小为什么是质数?四、链表法五、开放地址法线性探测法平方探测法双哈希(Double Hashing) 六、哈希表满了怎么办?七、完美哈希八、一些使用哈希解…

PGP 遇上比特币

重复使用 PGP 密钥作为比特币密钥 介绍 在数字安全领域,密码学在确保数据的完整性和真实性方面发挥着至关重要的作用。 一种广泛使用的加密技术是使用 Pretty Good Privacy (PGP1)。 PGP 为安全通信(例如电子邮件、文件传输和数据存储)提供加…

4G执法记录仪在高铁、地铁、机场应急处突中的应用

4G执法记录仪:高铁、地铁、机场紧急应对新利器 随着时代的迅猛发展,公共交通安全管理面临着越来越复杂的挑战。其中,高铁、地铁、机场这类人流密集的区域,要求高效、准确的应急响应与指挥调度机制。在这种背景下,4G/5G执法记录仪…