C++调用lua脚本,包括全局函数绑定、类绑定,十分钟快速掌握
系列文章目录
lua调用C/C++的函数,十分钟快速掌握
C++调用lua脚本,包括全局函数绑定、类绑定,十分钟快速掌握
- 系列文章目录
- 摘要
- 环境
- 使用步骤
- 码代码
- 自定义函数
- 多返回值
- 变长参数
- 自定义类
- test_sol2.lua内容
- 程序输出
摘要
在这个快节奏的技术博客中,我们将借助sol2库,以十分钟的时间快速掌握如何在C++中调用Lua脚本。sol2是一个轻量级的Lua绑定库,它简化了C++与Lua之间的交互,使得全局函数和类的绑定变得异常简便。我们将创建几个”复杂的“函数,变长参数、多返回值,和一个具有几个成员函数的简单类,通过sol2的简洁语法,只需几行代码,我们就能将C++函数绑定到Lua环境中,实现跨语言调用。
为了快速输出我们要讲的内容,我不仅提供了实际的示例代码,还将解释每一步的操作,确保能够迅速理解并运用这一技术。通过这十分钟的快速掌握,希望将能够在项目中充分发挥C++与Lua的优势,实现更灵活、高效的代码编写。无论是全局函数的调用还是类的绑定,sol2为C++与Lua的融合提供了一种极具便利性和效率的解决方案。
环境
| 工具\组件 | 版本 | 说明 |
|---|---|---|
| Windows | 10 | |
| visual studio | 2022 | |
| lua | 5.4 | |
| sol2 | 3.2.3 | |
| C++ | 17 | sol2需要 |
使用步骤
lua头文件和静态链接库或者动态库,从官方网站下载预编译好的即可,当然如果你有自定义需求也可自行修改编译。
引入sol2头文件,从github上下载。
# 就是这三个文件,要按此层次结构放好。
│ sol.hpp
│
└─solconfig.hppforward.hpp
visual studio新建个项目,C++语言标准设置为C++17。
加入头文件和库文件到项目中。
接下来就是码代码了。
码代码
自定义函数
多返回值
通过使用sol2我们不需要自己再写包装方法,这一下就省了不少代码。
std::tuple<int,const char*, double> multipleResultFunc(int a, const char* b, double c)
{//return std::tuple<int, char*, double>(a, b, c);return std::make_tuple(a, b, c);
}
变长参数
int variaArgs(sol::variadic_args va)
{int r = 0;for (auto v : va){r += static_cast<int>( v);}return r;
}
自定义类
class my_class{private:std::string m_str;public:int b = 24;int f() const{return 24;}void g(){++b;}void setTitle(const char* str){this->m_str = str;}void print(){std::cout << this->m_str << " , " << this->b << std::endl;std::wcout << this->rowname << L" , " << typeid( this->columns).name() << std::endl;}}
#define SOL_CHECK_ARGUMENTS 1
#include "sol.hpp"sol::state lua;lua.open_libraries(sol::lib::base);// "bark" namespacing in Lua// namespacing is just putting things in a tablesol::table bark = lua.create_named_table("bark");bark.new_usertype<my_class>("my_class","f", &my_class::f,"g", &my_class::g,"setTitle", &my_class::setTitle,"print", &my_class::print//,//"putUnsetValue", &my_class::putUnsetValue//,//"setSome", &my_class::setSome); // the usuallua.set_function("multipleResultFunc", multipleResultFunc);lua.set_function("variaArgs", variaArgs);// load and execute from filelua.script_file("test_sol2.lua");
test_sol2.lua内容
obj = bark.my_class.new()
obj:g()
local result =obj:f()
obj:setTitle("I am Tom , and you ?")
print(">>>>>>")
obj:print()bark.print_my_class(obj)
print(result)print(bark.add_two_number(1,2))mr, mr2, mr3 = multipleResultFunc(11, "Jerry", 123.45)
print(mr, mr2, mr3)
print(mr)print("call variable args function", 1, 2, 3, 4)
local r= variaArgs(1,2,3,4)
print(variaArgs, r)
程序输出
=== namespacing ===
I am Tom , and you ? , 25, class std::vector<unsigned long,class std::allocator<unsigned long> >
my_class { b: 25 }
24
3
11 Jerry 123.45
11
call variable args function 1 2 3 4
function: 0102B030 10
C source output Your name is Michael, and 2323 years old.
相关文章:
C++调用lua脚本,包括全局函数绑定、类绑定,十分钟快速掌握
系列文章目录 lua调用C/C的函数,十分钟快速掌握 C调用lua脚本,包括全局函数绑定、类绑定,十分钟快速掌握 系列文章目录摘要环境使用步骤码代码自定义函数多返回值变长参数 自定义类test_sol2.lua内容 程序输出 摘要 在这个快节奏的技术博客…...
快乐数[简单]
优质博文:IT-BLOG-CN 一、题目 编写一个算法来判断一个数n是不是快乐数。「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为1,也可能是无限循环但始终变不到1。如…...
Spring源码阅读-ClassPathXmlApplicationContext
第一步:new一个ClassPathXmlApplicationContext对象 ClassPathXmlApplicationContext xmlContext new ClassPathXmlApplicationContext("mylearn.xml"); 第二步:调用构造方法 public ClassPathXmlApplicationContext(String configLocatio…...
考研分享第2期 | 中央财经大学管理科学跨考北大软微金融科技406分经验分享
一、个人信息 本科院校:中央财经大学 管理科学与工程学院 管理科学专业 上岸院校:北京大学 软件与微电子学院 金融科技专业硕士 考试科目: 初试:思想政治理论 英语一 数学二 经济学综合 面试考察范围广,包括英语自…...
Linux安装java jdk配置环境 方便查询
编辑/etc/profile文件: vim /etc/profile 在文件尾部添加如下配置: export JAVA_HOME/usr/local/jdk1.8.0_161/ export CLASSPATH.: J A V A H O M E / j r e / l i b / r t . j a r : JAVA_HOME/jre/lib/rt.jar: JAVAHOME/jre/lib/rt.jar:JAVA_HOME/l…...
惊群效应之Nginx处理
文章目录 惊群概述Nginx 解决方案之锁的设计锁结构体原子锁创建原子锁获取原子锁实现原子锁释放 Nginx 解决方案之惊群效应总结: 惊群概述 在说nginx前,先来看看什么是“惊群”?简单说来,多线程/多进程(linux下线程进…...
SpringBoot整合Ldap--超详细方法讲解
LADP概述 LDAP(轻量目录访问协议)是一种用于访问和维护分布式目录信息服务的协议。目录服务是一种存储和检索信息的服务,通常用于存储组织内的用户信息、组织结构、网络设备等数据。LDAP是一种轻量级的协议,设计用于在目录中进行查…...
【工程实践】Docker使用记录
前言 服务上线经常需要将服务搬到指定的服务器上,经常需要用到docker,记录工作中使用过dcoker指令。 1.写Dockerfile 1.1 全新镜像 FROM nvidia/cuda:11.7.1-devel-ubuntu22.04ENV WORKDIR/data/Qwen-14B-Chat WORKDIR $WORKDIR ADD . $WORKDIR/RUN ap…...
FreeSwitch安装视频
文章目录 序言Centos7安装FreeSwitch-1.6 序言 学习资料来源《FreeSWITCH权威指南》-作者杜金房这本书。我是2022年6月毕业的,偶然的机会接触到FreeSWITCH,FreeSWITCH纯属个人爱好,进行笔记整理。也一直希望有机会可以参与FreeSWITCH相关工作…...
SpringBoot3+Vue3+Mysql+Element Plus完成数据库存储blob类型图片,前端渲染后端传来的base64类型图片
前言 如果你的前后端分离项目采用SpringBoot3Vue3Element Plus,且在没有OSS(对象存储)的情况下,使用mysql读写图片(可能不限于图片,待测试)。 耗时三天,在踩了无数雷后,…...
攻略 | 参与Moonbeam Ignite Ecosystem Tour
Moonbeam联合Moonwell和Beamswap一起举办社区链上活动,旨在让社区用户通过任务来探索Moonbeam、Moonwell、Beamswap平台。在了解如何使用的同时,参与任务挑战还有机会分得 1700 USDC 奖池 🎁 的奖励!我已经完成全部任务࿰…...
【python自动化】Playwright基础教程(七)Keyboard键盘
【python自动化】Playwright基础教程(七)Keyboard键盘 playwright模拟键盘操作 键盘事件提供了用于管理虚拟键盘的API,高级API是keyboard.type(),它使用的是原始字符再页面上生成对应的keydown 、 keypress / input 和 keyup 事件。 模拟真实键盘操作进行…...
Java读取文件内容写入新文件
要实现读写文件这个过程我们需要导入以下的包 import java.io.BufferedReader; import java.io.BufferedWriter;BufferedReader 用于逐行读取源文件的内容,BufferedWriter 用于逐行写入目标文件。 下面以示例了解如何操作: import java.io.BufferedRe…...
学习samba
文章目录 一、samba介绍二、samba的主要进程三、配置文件四、例子 一、samba介绍 1、SMB(Server Message Block)协议实现文件共享,也称为CIFS(Common Internet File System)。 2、是Windows和类Unix系统之间共享文件的…...
【Ansible】Ansible的Ad-hoc命令执行流程
Ansible的Ad-hoc命令执行流程 用了这么久的Ansible,今天想着研究下Ad-hoc命令的执行流程,从最简单的ping开始吧。 测试命令如下: ansible 172.18.2.31 -m ping先看看回显的结果 [rootbigdata-m-002 etc]# ansible 172.18.2.31 -m ping 17…...
Postgresql 常用整理
文章目录 1. 查询1.1数据库表1.1.1 获取指定数据库表1.1.2 获取指定数据库表所有列名 1.2 别名1.2.1 子表指定别名1.2.2 查询结果指定别名 1.3 临时表1.3.1 定义临时表1.3.2 使用临时表 1.4 子表1.5 分组1.5.1 group by1.5.2 partition by 1.6 分组后合并指定列字段:…...
如何在Jupyter Lab中安装不同的Kernel
❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…...
Java钩子函数的使用
目录 1. Java中常见的钩子函数 2. 使用钩子函数实现程序的清理工作 3. 使用钩子函数处理线程中的未捕获异常 4. 使用钩子函数实现窗口关闭时的操作 在Java编程中,钩子函数(Hook Function)是一种能够在特定事件发生时执行的代码块。钩子函…...
C++跨DLL内存所有权问题探幽(一)DLL提供的全局单例模式
最近在开发的时候,特别是遇到关于跨DLL申请对象、指针、内存等问题的时候遇到了这么一个问题。 问题 跨DLL能不能调用到DLL中提供的单例? 问题比较简单,就是我现在有一个进程A,有DLL B DLL C,这两个DLL都依赖DLL D的…...
短时间不点击云服务器,自动化断开连接,怎么设置长时间
在 Linux 系统中,如果你希望在一段时间内没有操作后保持远程连接不断开,可以通过修改 SSH 服务器的配置来实现。具体的步骤如下: 打开 SSH 服务器的配置文件: sudo vi /etc/ssh/sshd_config 找到以下两个参数并进行修改ÿ…...
Wan2.2-I2V-A14B部署教程:解决OOM/驱动报错/端口冲突三大常见问题
Wan2.2-I2V-A14B部署教程:解决OOM/驱动报错/端口冲突三大常见问题 1. 镜像概述与核心优势 Wan2.2-I2V-A14B是一款专为文生视频任务优化的私有部署镜像,特别针对RTX 4090D 24GB显存配置进行了深度优化。这个镜像最大的特点是解决了AI视频生成领域常见的…...
Pixel Couplet Gen部署案例:混合云架构(公有云API+私有云模型)方案
Pixel Couplet Gen部署案例:混合云架构(公有云API私有云模型)方案 1. 项目背景与价值 Pixel Couplet Gen是一款融合传统春节文化与现代像素艺术风格的AI春联生成器。该项目基于ModelScope大模型驱动,通过创新的8-bit像素游戏UI设…...
逆向工程实战:如何用dbcc解析第三方CAN协议(含自定义结构体改造技巧)
逆向工程实战:用dbcc深度解析非标CAN协议与结构体改造技巧 在汽车电子和工业控制领域,CAN总线协议逆向分析是一项极具挑战性的工作。面对没有文档说明的第三方设备或商用车辆黑盒协议,工程师常常需要从原始数据流中重建通信逻辑。本文将深入探…...
汽车智能制造如何落地?从“黑灯工厂”看AI赋能的关键路径
一、当工厂学会在黑暗中自行运转偌大的汽车生产车间里,灯光熄灭,只有AGV小车穿梭的微光和机械臂有节奏的运作声。没有工人的手电筒,也没有巡检的脚步,一切生产、检测、调度都在黑灯状态下有条不紊地进行。这并非科幻电影ÿ…...
ROS 实战指南:从 rosbag 高效提取 RGB 与深度图数据
1. rosbag基础操作与核心概念 在机器人开发领域,rosbag就像是一个万能的数据记录仪。想象一下你正在调试一个机器人视觉系统,传感器数据像流水一样不断涌来,这时候rosbag就能帮你把关键数据"冻住",方便后续反复分析。我…...
CMake + VTK 编译
CMake VTK 编译 1下载 1 CMake下载 https://cmake.org/download/#older2 VTK 下载 https://gitlab.kitware.com/vtk/vtk/-/tags2 安装和解压缩 3 配置CMake 这一部分忘了截图 ,可以查看这里的步骤,基本一致 https://blog.csdn.net/weixin_42964413/arti…...
Qwen3-14B私有化效果:支持国密算法加密的API通信安全方案
Qwen3-14B私有化效果:支持国密算法加密的API通信安全方案 1. 私有部署镜像概述 Qwen3-14B私有部署镜像是基于通义千问大语言模型优化定制的专业解决方案,特别针对RTX 4090D 24GB显存配置进行了深度适配。这个镜像不仅提供了完整的运行环境和模型依赖&a…...
CMake实战:用ExternalProject_Add一键集成第三方库(附spdlog完整配置)
CMake实战:用ExternalProject_Add一键集成第三方库(附spdlog完整配置) 在C项目开发中,第三方库的集成往往是最耗时的环节之一。传统的手动下载、编译、配置头文件路径和链接库文件的方式,不仅效率低下,还会…...
Java程序员如何入门音视频开发
对于Java程序员来说,他们缺乏参与音频和视频项目的经验。如何快速开始?你需要立即学习C吗?答案是否定的。 成功的关键在于循序渐进,从扎实的理论基础入手。第一步是学习多媒体基础理论。一本名为“多媒体基础概论”的教科书&#…...
GLM-4-9B-Chat-1M惊艳效果:复杂SQL代码库跨文件依赖关系可视化
GLM-4-9B-Chat-1M惊艳效果:复杂SQL代码库跨文件依赖关系可视化 1. 项目背景与核心价值 当你面对一个包含数百个SQL文件的大型数据仓库项目时,最头疼的问题是什么?我相信很多开发者和数据工程师都会说:理不清的表依赖关系。 传统…...
