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
英文地址,請注明出處:http://en.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;而你的包裹就是消息。快遞站接…