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 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Sass 安装

文章目录 前言SASS的系统要求安装Ruby例子后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:Sass和Less 🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误&…

编程题 :简单的洗牌算法的实现

📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 目录 🌤️简单的洗牌算法…

大语言模型:以Amazon Titan等大语言模型为例介绍

大语言模型(Large Language Model)是一种人工智能技术,通过对海量文本数据进行训练,学习语言的结构、规则和语义,从而可以生成具有自然语言风格的文本或回答自然语言的问题。大语言模型一般基于神经网络技术&#xff0…

【深度学习】gan网络原理实现猫狗分类

【深度学习】gan网络原理实现猫狗分类 GAN的基本思想源自博弈论你的二人零和博弈,由一个生成器和一个判别器构成,通过对抗学习的方式训练,目的是估测数据样本的潜在分布并生成新的数据样本。 1.下载数据并对数据进行规范 transform tran…

界面控件DevExpress WPF流程图组件,完美复制Visio UI!(二)

DevExpress WPF Diagram(流程图)控件帮助用户完美复制Microsoft Visio UI,并将信息丰富且组织良好的图表、流程图和组织图轻松合并到您的下一个WPF项目中。 在上文中(点击这里回顾>>),我们为大家介绍…

Spinnaker 基于 docker registry 触发部署

docker registry 触发部署 Spinnaker可以通过Docker镜像的变化来触发部署,这种方法允许你在Docker镜像发生变化时自动启动新的部署流程。 示例原理如下图所示: 以下是如何在Spinnaker中实现基于Docker Registry触发部署的配置流程。最终实现的效果如下…

Leetcode—167.两数之和 II - 输入有序数组【中等】

2023每日刷题(四十一) Leetcode—167.两数之和 II - 输入有序数组 实现代码 /*** Note: The returned array must be malloced, assume caller calls free().*/ int* twoSum(int* numbers, int numbersSize, int target, int* returnSize) {*returnSiz…

lv11 嵌入式开发 UART实验 11

目录 1 UART帧格式详解 1.1 UART简介 1.2 通信基础 - 并行和串行 1.3 通信基础 - 单工和双工 1.4 通信基础 - 波特率 1.5 UART帧格式 2 Exynos4412下的UART控制器 2.1 引脚功能设置 2.2 阅读芯片手册 3 UART寄存器详解 3.1 引脚寄存器 3.2 串口寄存器概览 3.3 ULC…

【Linux】 file命令使用

file命令 file命令用于辨识文件类型。 语法 file [参数] [文件名] who命令 -Linux手册页 命令选项及作用 执行令 file --help 执行命令结果 参数 -b  列出辨识结果时,不显示文件名称;-i:显示MIME类型;-z:对…

pycharm 怎么切换Anaconda简单粗暴

(1)创建一个环境 (2)选择一下自己conda的安装路径中conba.exe (3)选择存在的环境,一般会自动检测到conda创建有哪些环境,导入就行

MUI框架从新手入门【webapp开发教程】

文章目录 MUI -最接近原生APP体验的高性能前端框架APP开发3.25 开发记录miu框架介绍头部/搜索框:身体>轮播图轮播图设置数据自动跳转:九宫格图片九宫格图文列表底部选项卡按钮选择器手机模拟器 心得与总结:MUI框架在移动应用开发中的应用M…

【MATLAB源码-第91期】基于matlab的4QAM和4FSK在瑞利(rayleigh)信道下误码率对比仿真。

操作环境: MATLAB 2022a 1、算法描述 正交幅度调制(QAM,Quadrature Amplitude Modulation)是一种在两个正交载波上进行幅度调制的调制方式。这两个载波通常是相位差为90度(π/2)的正弦波,因此…

uniapp基础-教程之HBuilderX基础常识篇03

该内容为了大家更好的理解,将每个页面进行分离,单独创建项目,如在index中之写只写了一个搜索框,将其他页面分别放在HBuilderX目录中的components中,没有的可自行创建。 然后在components中创建轮播图新建一个swiper.v…

RWA+AI 叙事下的 ProsperEx,对 Web3 时代交易的重新定义

RWA(Real World Assets)即现实资产代币,其本质在于将现实世界中具有货币价值的东西转化为数字代币,使其可以在区块链上表现价值并进行交易。RWA 资产既可以包括有形资产,例如房产、珠宝、黄金等,也可以包无…

Python的控制流语句使用

Python的控制流语句使用 判断语句 if分支示意图语法介绍注意事项示例 for循环示意图语法介绍列表推导式示例 while循环与for的区别语法介绍示例 判断语句 if分支 示意图 单、双、多分支: 语法介绍 # 单分支 if condition:expression # 双分支 if condition:exp…

【C语言】结构体

目录 1. 前言2. 结构体类型的声明2.1 结构体的概念2.2 结构的创建2.3 特殊的声明2.4 结构的自引用 3. 结构成员访问操作符4. 结构体内存对齐4.1 对齐规则4.2 为什么存在内存对齐?4.3 修改默认对齐数 5. 结构体传参6. 结构体实现位段6.1 什么是位段6.2 位段的内存分配…

蓝牙概述及基本架构介绍

蓝牙概述及基本架构介绍 1. 概述1.1 蓝牙的概念1.2 蓝牙的发展历程1.3 蓝牙技术概述1.3.1 Basic Rate(BR)1.3.2 Low Energy(LE) 2. 蓝牙的基本架构2.1 芯片架构2.2 协议架构2.2.1 官方协议中所展示的蓝牙协议架构2.2.1.1 全局分析2.2.1.2 局部分析 2.2.2…

android自定义桌面应用

android自定义桌面应用 这篇文章主要讲下自定义桌面应用. 效果主要是调用packageManager来获取当前所有的程序,并在自定义桌面程序中展示,并支持跳转. 主要的代码如下: 1.manifest声明 <activity android:name".MainActivity"><intent-filter><ac…

【Spring Boot】Swagger的常用注解

在Swagger的开发过程中&#xff0c;我们需要在Controller代码等处添加相应的注解&#xff0c;以便可以提高生成的接口文档的可读性为了解决这些问题&#xff0c;Swagger提供了很多的注解&#xff0c;通过这些注解&#xff0c;我们可以更好更清晰的描述我们的接口&#xff0c;包…

如何运用AppLink平台中的数据连接器组件

AppLink平台组件组成 AppLink平台组件分成三个板块触发事件组件、基础组件和数据连接器 数据连接器组件里面有10个组件&#xff0c;目前也在不断新增更多的数据连接器&#xff0c;那他们在AppLink平台里的原理、触发动作以及怎么使用呢&#xff1f;接下来用MySQL和TimescaleD…