C++中使用Lua脚本 和lua中调用c的方法

第二章 Lua使用C++中的类 Lua使用C++中的类——调用方法  本以为在Lua中使用C++的类一件非常复杂的事情。毕竟C++的类与Lua有那么多的不同。但是,困难都是纸老虎,只要想办法问题很容易就解决了。           首先,我们要搞明白C++中类和对象的概念。这个概念想要表述清楚是很难的。但是,下面的表达式却道出了类和对象的本质:                                 类 阅读详情

参考http://blog.youkuaiyun.com/kun1234567/archive/2007/12/11/1929815.aspx
第1步:下载
从官方主页www.lua.org下载Lua源代码,最新版本为5.1.3。
解压之后找到“[Lua]/src”文件夹,这里面就是Lua了,不过还不能直接使用。

第2步:编译lua
使用任意ANSI C编译器,在这里使用VS2005编译LUA。具体步骤如下:
a.打开vs的命令行工具,工具-->visual studio 2005 command prompt
b.跳转到[Lua]目录,例如:cd D:/Program Files/Lua
c.执行:etc\luavs.bat( 注意,是 \ 不是 /,写错了不能执行编译 )
d.然后lua51.dll, lua51.lib, lua.exe, and luac.exe就生成在 src 路径下了
e.在windows环境变量中把[Lua]\src添加到系统Path中去,

第3步:创建lua脚本
下载LuaEdit http://luaforge.net/frs/download.php/1037/LuaEdit_2_5.zip 他是Lua脚本的编辑工具,还可以对Lua脚本进行语法检测和调试。你也可以其他的纯文本编辑工具写一个文件 test.lua,注意后面是没有分号‘;’的
function f ( x, y)
return x + y
end

第4步:在C++ 中调用Lua脚本
开启VC++6.0环境创建一个新文件main.cpp
// Win32Console.cpp : Defines the entry point for the console application.
//

#include
" stdafx.h "

extern " C "
{
#include
"D:/Lib/Lua/lua.h"
#include
"D:/Lib/Lua/lualib.h"
#include
"D:/Lib/Lua/lauxlib.h"
}

#pragma comment( lib ,
" D:/Lib/Lua/lua51.lib " )
lua_State
* L;

// 调用lua
double fun( double x, double y )
{
double ret;
lua_getglobal( L,
"add"); // 获取全局变量f
lua_pushnumber( L,x); // 操作数压栈
lua_pushnumber( L,y); // 操作数压栈
lua_call( L, 2, 1); // 执行:2个操作数,1个返回值
//lua_pcall( L, 2, 1, 0); // 保护模式的lua_call,0为错误处理码。具体应用暂时不明,在使用手册中有粗略介绍
ret = lua_tonumber( L, -1); // 将栈顶元素转换成数字并赋值给ret
lua_pop( L, 1); // 从栈中弹出一个元素
return ret;
}


// 被lua调用的方法
static int average(lua_State * L2)
{
/**//* get number of arguments */
int n = lua_gettop(L2);
double sum = 0;
int i;
/**//* loop through each argument */
for (i = 1; i <= n; i++)
{
/**//* total the arguments */
sum
+= lua_tonumber(L2, i);
}

lua_pushnumber(L, sum
/ n);
/**//* push the sum */
lua_pushnumber(L, sum);
/**//* return the number of results */
printf(
"average called. [ok]\n");
return 2;
}

// ==============================================
// Main Functions
// ==============================================
int main( void )
{
int error;
L
= lua_open(); // 创建Lua接口指针(借用DX的术语,本质是个堆栈指针)
luaopen_base(L); // 加载Lua基本库
luaL_openlibs(L); // 加载Lua通用扩展库
/**//*
可能有的文章会采用以下写法,手工控制加载哪些库:
luaopen_table(L); // 加载table库
luaopen_io(L); // 加载IO库
luaopen_string(L); // 加载string库
luaopen_math(L); // 加载math库
经过测试,luaopen_io(L);该句执行异常,可能跟Lua的IO库有关系。具体原因暂时没有追究,将来如果有机会弄清楚,再回头来阐述。
*/


/**//* load the script */
lua_register(L,
"average", average);
error
= luaL_dofile(L, "hellow.lua"); // 读取Lua源文件到内存编译

double ret = fun( 10, 3.4); // 调用模版函数f
printf( "ret = %f\n", ret); // 输出结果,C语言的东西,跟Lua无关
lua_close( L);
return 1;
}


创建一个hellow.lua文件和main.cpp放在一起,写入以下内容
function add ( x, y)
file
= assert(io.open( " data.txt " , " w " ))
file:write(
" abcde\n " )
file:write(
" ok!\n " )
file:close()

-- DataDumper( 1 , 2 , 3 , 4 )
file
= assert(io.open( " data.txt " , " r " ))
str
= file:read( " *a " )
io.write(str)
io.write(
" \n " )

avg, sum
= average( 10 , 200 , 3000 )
print(
" The average is " , avg)
print(
" The sum is " , sum)

return x + y
end
Lua脚本如何调用C/C++模块,Windows以及Linux版本演示 lua与c/c++的交互,已打包好测试用例涉及的动态库(.so,.dll)文件 阅读详情

相关推荐

C++ 对象的Lua脚本化

脚本化编程 脚本化编程的最大好处就是简单灵活,另外就是热更新,这在网游中广泛被采用,在网游中,通常采用引擎(c/C++)+脚本(lua/python)的架构,那种SDK性质的代码放在引擎中,这些代码在游戏上线后通常很稳定很少被修改,而真正游戏逻辑的制作就都在脚本层中进行。这样有两个好处:1.脚本层的bug基本不会导致程序的crash,因为是沙盒的。2.对于运行的代码,可以方便的采用热更新修复bu

leon 3512

vs如何在C++中调用Lua

最近Cocos2dx的学习卡壳了,一般的照抄代码我不想写上来,但想示例也想得我头晕...为了放松大脑调整状态于是开始学习Lua。Lua的语法学习还是比较简单的,学过javascript或者vbscript的应该很容易就能上手,那些Lua独有的特性也是比较有趣,例如不定数目的多参数函数和随意的参数返回值等。 这里想要吐槽一下最近用来学习Lua的书籍《XX开发实践指南》(虽然没有写全名不过搜索过Lu...

weixin_33897722的博客 205

lua和c/c++交互

lua 和c采用虚拟栈的方式传递数据,栈中的元素是以lua 数据结构的方式存储,

Waorange的博客 1598

C/C++中调用LUA函数

1 配置工作环境 a 下载LUA安装包 sf_200472410155.zip        b 然后,解压用于WIN32下的安装包。放在一个盘的目录下如:C:/LUA50        c  打开VC++6.0,点击Project下的Setting中将include目录设为C:/LUA50。 并在LIB库中加入lua+lib.lib ,并将C:/LUA50下的Lua+lib.

gumingyaotangwei 的专栏 1485

Lua常用C API与C/C++交互

“Lua handles a chunk as the body of an anonymous function with a variable number of arguments”这是Lua对chunk也就是lua文件的处理方式,就是认为是一个可变参数的匿名函数。也就是说,调用后栈上有一个匿名函数,这个函数的body就是文件中所有的内容。

悦分享 1213

【邻接表存图模板】vector邻接表、数组邻接表、链式前向星

一、目录 一、目录 二、前言 三、邻接表“详解” (一)边的信息 (二)几种邻接表的实现方法“详解” 1.数组邻接表 代码 2.vector邻接表 代码 vector邻接表还有一种魔性写法: 3.链式前向星 代码 四、总结 二、前言 本来之前自己太弱了,一直只会用邻接矩阵,后来发现邻接表才是主流... 参考&特别鸣谢: https://www.cnblog...

十里寒塘路♣烟花一半醒 3113

lua学习:lua与C/C++程序的整合

lua与C/C++交互,主要靠lua API和向lua注册好的函数。 这里起关键作用的要数lua_State的结构,这就得讲一下Lua环境和Lua Stack。 Lua环境 Lua环境由所有可操作的数据构成,如编译好的函数、变量以及其他运行时内存。这些数据保存在一个称做lua_State的结构中。所有Lua应用程序都要求至少有一个lua_State,如果需要还可以有多个(如需

—— 6659

Kubernetes+EdgeX:构建企业级AI边缘推理平台

设备:工业摄像头(RTSP协议,输出1920x1080视频流);AI模型:YOLOv8训练的轴承裂纹检测模型(识别“裂纹”“正常”两种类型);目标:摄像头采集图像→EdgeX传输数据→K8s推理服务检测→结果反馈到报警器(HTTP协议)。Kubernetes+EdgeX的组合,为企业构建AI边缘推理平台提供了标准化、可扩展标准化:K8s的容器编排和EdgeX的设备管理,都是行业标准,避免“重复造轮子”;可扩展:支持从单边缘节点到 thousands of nodes 的规模,满足企业的增长需求;

AI算力网络与通信的博客 1343

Lua脚本语言学习笔记

什么是脚本语言? 1.一种解释运行而非编译的计算机语言。 2.以文本的形式保存,在被调用时进行解释或编译。 为什么要使用LUA脚本语言? 1.提高工作效率。项目规模扩大,编译源代码所需时间变长。为了不因为一些小的改动(改变几个常量的值),就去编译整个项目,所以使用脚本语言。 2.提高创造性。使用lua脚本,不仅可以帮你初始化变量,还可以帮你创建游戏逻辑甚至是游戏对象。 3.增加扩展

仰望圣光的plusplus7 3359

从零搭建无人机仿真环境:ROS 2与Gazebo Fortress实战指南

本文提供了一份详细的无人机仿真环境搭建实战指南,基于Ubuntu 22.04系统,整合ROS 2 Humble与Gazebo Fortress两大核心工具。通过分步讲解安装、配置及桥接过程,并引入PX4飞控与XTDrone2工具链,帮助开发者快速构建一个稳定、高效的无人机算法开发与测试平台,有效降低真机测试的成本与风险。

water的专栏 428

c/c++与lua互相调用

Lua是一种强大,高效,轻量级,可嵌入的脚本语言。 它支持过程编程,面向对象的编程,功能编程,数据驱动的编程和数据描述。 本文将介绍c/c++与lua如何互相调用

itas109的专栏 875

【滚雪球学数学建模】第1节·建模入门+三步法+案例

🎓 本文收录于 《滚雪球学数学建模》专栏,本专栏专注于从零基础出发,带你循序渐进掌握数学建模的核心方法与思维路径。通过“滚雪球式”学习法,从最简单的生活化案例到经典建模工具,再到省赛、国赛真题实战演练,逐步积累知识与技能,帮助你搭建完整的建模体系。无论你是刚接触建模的新生,还是希望提升科研与竞赛能力的学者与工程师,本专栏都将为你提供一条清晰、高效、可实操的建模成长路线,助力你快速进阶,突破难点,迈向数学建模竞赛与实际应用的更高峰 🚀!

**My Coding Family** 6409

Lua与C/C++之间的交互

一、通信原理详解 1.1、堆栈概念 要理解Lua和C++交互,首先要理解Lua堆栈。简单来说,Lua和C/C++语言通信的主要方法是一个无处不在的虚拟栈,栈的特点是先进后出。 在Lua中,Lua堆栈就是一个struct,堆栈索引的方式可是正数也可以是负数,区别是:正数索引1永远表示栈底,负数索引-1永远表示栈底,如下图示: Lua的栈类似于以下的定义,它是在创建lua_State时创建的: TValue stack[max_stack_len] --可查lstate.c中的stack_init函数 存入

贝勒里恩的博客 1104

Winform从入门到精通(1)——Label(史上最全)

本篇文章是对专栏《winform控件从入门到精通》的详细介绍

qq_34059233的博客 4万+

Deepfake检测模型-PyDeepFakeDet项目复现实验报告-深度学习

该实验是对于https://github.com/wangjk666/PyDeepFakeDet模型的复现。PyDeepFakeDet 是一款集成的、可扩展的 Deepfake 检测工具。目标是提供最先进的 Deepfake 检测模型以及用于在常用 Deepfake 数据集上训练和评估新模型的接口。

一位不是很硕的鉴伪方向硕士 5494

Lua与C C++的交互(二)

四.交互示例1.  C/C++代码中调用Lua脚本int test_lua1() { int ret=0; lua_State* pLuaEnv; pLuaEnv = luaL_newstate(); if (pLuaEnv == nullptr) { ret=-20; return ret; } ret = luaL_loadstring(pLuaEnv, "functi...

guxch的专栏 706

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Lua与C/C++交互——C/C++调用Lua脚本

0.简介 上期介绍了如何在Lua中调用C/C++代码,本期介绍如何在C/C++中调用Lua脚本。有关Lua与C/C++交互的基础知识以及Lua堆栈操作,请见《Lua与C/C++交互——Lua调用C/C++》一文。 一、Lua堆栈 要理解Lua和C++交互,首先要理解Lua堆栈。 简单来说,Lua和C/C++语言通信的主要方法是一个无处不在的虚拟栈。栈的特点是...

366

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Linux下lua安装使用,与C/C++交互

C++和Lua交互

deroy 1586

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C/C++与lua互调函数的方法

1,在lua脚本中调用C/C++代码中的函数 在C++中定义函数时必须以lua_State为参数, 以int为返回值才能被Lua所调用。 /* typedef int (*lua_CFunction) (lua_State*L); C 函数的类型。 为了正确的和 Lua 通讯,C 函数必须使用下列定义了参数以及返回值传递方法的协议: C 函数通过 Lua 中的堆栈来接

晓阳 的专栏 1482
上一篇: C++沉思录上提到的一道练习题及其源码实现
下一篇: lua和c/c++互相调用实例分析
执迷的信徒
博客等级 码龄16年 245粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值