C/C++ 与 Lua 互相调用详解

        Lua 是一门轻量级、嵌入式的脚本语言,常常与 C/C++ 结合使用。通过嵌入 Lua,可以让应用程序获得灵活的配置、脚本化逻辑和可扩展性。

         本文将介绍如何在 C/C++ 调用 Lua 函数,以及如何让 Lua 调用 C/C++ 函数。最后给出一个 完整的示例工程,可以直接编译运行。


一、C 调用 Lua

Lua 脚本(script.lua):

-- 定义一个 Lua 函数
function add(a, b)return a + b
end

C++ 代码调用:

lua_getglobal(L, "add");   // 获取 Lua 中的函数
lua_pushnumber(L, 10);     // 压入参数
lua_pushnumber(L, 20);if (lua_pcall(L, 2, 1, 0) != 0) {std::cerr << "Error: " << lua_tostring(L, -1) << std::endl;
}double result = lua_tonumber(L, -1); // 获取返回值
lua_pop(L, 1);                       // 弹出栈顶

运行后会输出 30


二、Lua 调用 C/C++

Lua 可以调用在 C/C++ 里注册的函数。

C++ 代码:

int cpp_multiply(lua_State* L) {int a = luaL_checkinteger(L, 1);int b = luaL_checkinteger(L, 2);lua_pushinteger(L, a * b);return 1; // 返回值数量
}

注册函数:

lua_register(L, "cpp_multiply", cpp_multiply);

Lua 调用:

print("cpp_multiply result:", cpp_multiply(6, 7))

运行后会输出 42


三、完整示例工程

目录结构

demo-lua/
├── CMakeLists.txt
├── main.cpp
└── script.lua


1. CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(demo-lua CXX)set(CMAKE_CXX_STANDARD 11)# 查找 Lua
find_package(PkgConfig REQUIRED)
pkg_search_module(LUA REQUIRED lua5.3)include_directories(${LUA_INCLUDE_DIRS})
link_directories(${LUA_LIBRARY_DIRS})add_executable(demo main.cpp)
target_link_libraries(demo ${LUA_LIBRARIES})

2. script.lua

-- Lua 脚本文件-- 定义函数
function add(a, b)return a + b
end-- 调用 C++ 注册的函数
function test_cpp_func()local res = cpp_multiply(6, 7)print("cpp_multiply result from Lua:", res)
end

3. main.cpp

#include <iostream>
#include <lua.hpp>// C++ 函数:在 Lua 中注册为 cpp_multiply
int cpp_multiply(lua_State* L) {int a = luaL_checkinteger(L, 1);int b = luaL_checkinteger(L, 2);lua_pushinteger(L, a * b);return 1;
}int main() {lua_State* L = luaL_newstate();   // 创建 Lua 虚拟机luaL_openlibs(L);                 // 打开标准库// 注册 C++ 函数到 Lualua_register(L, "cpp_multiply", cpp_multiply);// 加载 Lua 脚本if (luaL_dofile(L, "script.lua")) {std::cerr << "Failed to load script.lua: "<< lua_tostring(L, -1) << std::endl;lua_close(L);return 1;}// 调用 Lua 的 add() 函数lua_getglobal(L, "add");lua_pushnumber(L, 10);lua_pushnumber(L, 20);if (lua_pcall(L, 2, 1, 0) != 0) {std::cerr << "Error running add(): "<< lua_tostring(L, -1) << std::endl;lua_close(L);return 1;}double result = lua_tonumber(L, -1);lua_pop(L, 1);std::cout << "Result from Lua add(): " << result << std::endl;// 调用 Lua 的 test_cpp_func()lua_getglobal(L, "test_cpp_func");if (lua_pcall(L, 0, 0, 0) != 0) {std::cerr << "Error running test_cpp_func(): "<< lua_tostring(L, -1) << std::endl;}lua_close(L);return 0;
}

四、构建与运行

# 编译
mkdir build && cd build
cmake ..
make# 运行
./demo


五、运行效果


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

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

相关文章

2025-09-04 HTML2——常用标签与属性

文章目录1 文本标签1.1 标题 (<h1> - <h6>)1.2 段落 (<p>)1.3 文本格式化1.4 列表1.4.1 无序列表 (<ul>)1.4.2 有序列表 (<ol>)1.5 表格 (<table>)2 属性2.1 属性值2.2 全局属性2.3 特定元素的属性2.4 布尔属性2.5 自定义属性2.6 事件处理…

Cursor安装使用 与 Cursor网页端登录成功,客户端怎么也登陆不上

Cursor安装使用 Cursor是一款基于AI技术的智能代码编辑器&#xff0c;可通过官网&#xff08;https://cursor.sh&#xff09;下载安装(国内网直接可以访问)&#xff0c;其核心功能包括代码自动生成、智能补全和多轮对话编程&#xff0c;支持Windows、MacOS和Linux系统。‌ 1.…

从开发到部署深度解析Go与Python爬虫利弊

选爬虫技术就像挑工具&#xff1a;Python像瑞士军刀&#xff0c;啥都能干还上手快&#xff0c;写两行代码就能爬数据&#xff0c;适合快速出活和中小项目&#xff1b;Go语言则是专业电钻&#xff0c;并发性能超强&#xff0c;一台机器顶千军万马&#xff0c;适合搞大规模和高性…

基于FP6195的60V宽压输入降压电源方案 - 适用于智能家居模块供电

随着智能家居照明系统多模块化&#xff08;如蓝牙、WiFi、ZigBee&#xff09;供电需求的增加&#xff0c;目前市面上大多采用AC-DC隔离LED驱动芯片&#xff08;如&#xff1a;XP3358,XP3359&#xff09;将交流电转换为48V直流电压&#xff0c;为后级电路供电。而常用模块&#…

贪心算法应用:化工反应器调度问题详解

Java中的贪心算法应用&#xff1a;化工反应器调度问题详解 1. 问题背景与定义 化工反应器调度问题是工业生产中的一个经典优化问题&#xff0c;涉及如何在多个反应器之间分配化学反应任务&#xff0c;以优化特定的目标&#xff08;如最小化总完成时间、最大化产量或最小化能源消…

Go语言中atomic.Value结构体嵌套指针的直接修改带来的困惑

问题 这里有段代码&#xff0c;是真实碰到的问题&#xff0c;这个是修改之后的&#xff0c;通过重新定义个临时变量拷贝原指针的值&#xff0c;再返回该变量的地址&#xff0c;添加了两行&#xff0c;如果去掉如下的代码&#xff0c;可以思考一下var toolInfo model.McpTools /…

(1) 虚拟化、多任务、超线程技术

目录 1.虚拟化技术 1.1 本节导图 1.2 虚拟化技术是什么&#xff1f;使用目的是什么&#xff1f; 1.3 虚拟化前后对比图 1.4 虚拟化的优势 1.5 虚拟化的劣势 1.6 虚拟化的本质 2. 多任务 2.1 本节导图 2.2 什么是多任务处理 2.3 多任务原理 2.4 功能单位 2.5 多任务…

为什么TVS二极管的正极要接电路中的负极?-ASIM阿赛姆

TVS二极管极性接法原理深度解析&#xff1a;为何正极需接电路负极&#xff1f;本文基于半导体物理机制与电路保护原理&#xff0c;系统分析TVS二极管&#xff08;瞬态电压抑制器&#xff09;在反向工作模式下的极性接法设计。通过剖析PN结雪崩击穿特性、电路回路设计约束及失效…

Day12--HOT100--23. 合并 K 个升序链表,146. LRU 缓存,94. 二叉树的中序遍历

Day12–HOT100–23. 合并 K 个升序链表&#xff0c;146. LRU 缓存&#xff0c;94. 二叉树的中序遍历 每日刷题系列。今天的题目是《力扣HOT100》题单。 题目类型&#xff1a;链表&#xff0c;二叉树。 LRU缓存要重点掌握。 23. 合并 K 个升序链表 方法&#xff1a;暴力 思路&…

【LeetCode热题100道笔记】二叉树展开为链表

题目描述 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。 展开后的单链表应该与二叉树 先序遍历 顺序相同。 示例 …

华为OmniPlacement技术深度解析:突破超大规模MoE模型推理瓶颈的创新设计

MoE模型的崛起与负载均衡挑战 混合专家模型&#xff08;Mixture of Experts&#xff0c;MoE&#xff09;作为大规模深度学习的前沿架构&#xff0c;通过稀疏激活模式成功地将模型参数规模推向了新的高度&#xff0c;同时保持了相对合理的计算成本。其核心思想是使用多个专门的…

分享一个基于Python+大数据的房地产一手房成交数据关联分析与可视化系统,基于机器学习的深圳房产价格走势分析与预测系统

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Spark、hadoop、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题…

【C++题解】DFS和BFS

4小时编码练习计划&#xff0c;专注于深度优先搜索&#xff08;DFS&#xff09;和广度优先搜索&#xff08;BFS&#xff09;这两种基本且强大的算法。 下午 (4小时): 搜索算法专题——DFS与BFS DFS和BFS是图论和多种问题求解中的基石算法。深刻理解它们的原理、差异和代码实现模…

Android模拟简单的网络请求框架Retrofit实现

文章目录1.静态代理2.动态代理3.实现简单的Retrofit定义对应的请求注解参数通过动态代理模拟Retrofit的创建请求参数的处理定义请求接口测试请求1.静态代理 代理默认给某一个对象提供一个代理对象&#xff0c;并由代理对象控制对原对象的引用。通俗来讲&#xff0c;代理模式就…

Matter安全实现

Matter分析与安全验证 上一篇文章简单的介绍了Matter的架构、实现、以及部分安全验证过程&#xff1b;这里继续补充一下Matter的其他安全验证流程&#xff0c;以更好的实现Matter安全。 Matter提供的安全实现流程大概总结起来是这个流程 硬件信任根→安全启动→动态证书→加密…

从基础到实践:Web核心概念与Nginx入门全解析

从基础到实践&#xff1a;Web核心概念与Nginx入门全解析 文章目录从基础到实践&#xff1a;Web核心概念与Nginx入门全解析一、Web是什么&#xff1f;从基本概念到核心架构1.1 Web的本质&#xff1a;一个超文本信息系统1.2 B/S架构&#xff1a;Web的“前端-后端”分工模式二、一…

【完整源码+数据集+部署教程】加工操作安全手套与手部检测系统源码和数据集:改进yolo11-cls

背景意义 研究背景与意义 随着工业自动化和智能制造的迅速发展&#xff0c;工人安全问题日益受到重视。特别是在涉及重型机械和危险操作的工作环境中&#xff0c;工人手部的安全保护显得尤为重要。传统的安全手套虽然在一定程度上能够保护工人的手部&#xff0c;但在复杂的加工…

代码随想录算法训练营第一天 || (双指针)27.移除元素 26.删除有序数组中的重复项 283.移动零 977.有序数组的平方

代码随想录算法训练营第一天 || (双指针)27.移除元素 26.删除有序数组中的重复项 283.移动零 27.移除元素 暴力方法 同向双指针双指针 自己AC的解答 卡哥的讲解 26.删除有序数组中的重复项 同向双指针 283.移动零 自己解答 灵神做法(同向双指针+交换) 977.有序数组的平方 暴…

Java全栈开发工程师面试实录:从基础到实战的深度探讨

Java全栈开发工程师面试实录&#xff1a;从基础到实战的深度探讨 一、初识与自我介绍 面试官&#xff08;李工&#xff09;&#xff1a; 你好&#xff0c;欢迎来到我们公司。我是负责技术面试的李工&#xff0c;今天我们将进行一场关于Java全栈开发的深入交流。你可以先简单介绍…

Kafka:Java开发的消息神器,你真的懂了吗?

Kafka&#xff1a;Java开发的消息神器&#xff0c;你真的懂了吗&#xff1f; 一、Kafka 是什么鬼&#xff1f; 想象一下&#xff0c;你在网上疯狂剁手后&#xff0c;满心期待着快递包裹的到来。这时候&#xff0c;快递站就像是 Kafka&#xff0c;而你的包裹就是消息。快递站接…