Lua腳本如何執行主程序的C函數

Lua Call C function

Lua腳本可以和C函數靈活的結合,Lua腳本作為控制語言,使用C函數來做性能計算部分。
Lua腳本的執行器有Lua 和 Luajit。
使用Lua執行器,可以通過C語言注冊C函數到Lua State, 然后Lua腳本可以調用該C函數。

使用Luajit,支持FFI,可以支持 require(“libxxx.so”) , 通過函數符號表請求,同時Luajit也可以支持調用主程序的函數。
本文將展示Lua腳本直接調用主程序函數的例子。

主程序導出動態符號表

主程序默認是沒有自定義的函數的符號的
請添加圖片描述

編譯選項增加 -rdynamic

就包含了自定義函數的動態符號表
請添加圖片描述

Lua查找并使用C函數

引用ffi,先定義函數

local ffi = require("ffi")-- 1. 先做C接口定義
ffi.cdef[[bool SendMsg(const char* json_str, const char* str1, const char* str2, int pri);int AddNumbers(int a, int b);
]]-- 測試基本函數調用
print("\n基本函數調用:")
local result = ffi.C.SendMsg('{"temp": 25.5}', "data", "sensor", 0)
print("Send result:", result)

Makefile指定Luajit執行器

Luajit是必須的,如果是lua執行器,則不支持該操作

TARGET = test2SRCS = $(wildcard *.cpp)CC = g++CFLAGS += -g -O2 -std=c++11 -I/usr/local/include/luajit-2.1/LDFLAGS += -lyaml-cpp -L/usr/local/lib -lluajit-5.1 -ldl -rdynamic
all: $(TARGET)$(TARGET): $(SRCS)$(CC) $(CFLAGS) $(SRCS) -o $@ $(LDFLAGS).PHONY: clean
clean:rm $(TARGET)

C代碼定義函數,執行Lua

luaL_dofile 即執行指定Lua腳本

    lua_State *L = luaL_newstate();luaL_openlibs(L);// Load Lua scriptif (luaL_dofile(L, "advanced_ffi.lua") != LUA_OK) {fprintf(stderr, "Error loading Lua script: %s\n", lua_tostring(L, -1));lua_close(L);return 1;}lua_close(L);

完整代碼simple_ffi.cpp

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
extern "C" {#include "lua.h"#include "lauxlib.h"#include "lualib.h"#include <stdint.h>// 要被Lua FFI調用的C函數
bool SendMsg(const char* json_str, const char* str1, const char* str2, int pri) {printf("=== C Function Called ===\n");printf("JSON: %s\n", json_str ? json_str : "NULL");printf("str-1: %s\n", str1 ? str1 : "NULL"); printf("str-2: %s\n", str2 ? str2 : "NULL");printf("Priority: %d\n", pri);if (!json_str || !str2) {printf("ERROR: Missing required parameters\n");return false;}printf("Message sent successfully!\n");return true;
}int AddNumbers(int a, int b) {printf("C function: %d + %d = %d\n", a, b, a + b);return a + b;
}const char* GetVersion() {return "FFI Demo v1.0";
}}int main() {printf("C Program: Functions are ready for FFI access\n");printf("You can now run: luajit ffi_test.lua\n");// 演示直接調用printf("\nDirect C calls:\n");SendMsg("{\"test\":\"data\"}", "sub", "title", 5);printf("Add result: %d\n", AddNumbers(10, 20));printf("Version: %s\n", GetVersion());lua_State *L = luaL_newstate();luaL_openlibs(L);// Load Lua scriptif (luaL_dofile(L, "advanced_ffi.lua") != LUA_OK) {fprintf(stderr, "Error loading Lua script: %s\n", lua_tostring(L, -1));lua_close(L);return 1;}lua_close(L);printf("All tests completed successfully.\n");return 0;
}

測試

導出函數符號表的test2,執行成功。

請添加圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/94052.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/94052.shtml
英文地址,請注明出處:http://en.pswp.cn/web/94052.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

農業-學習記錄

1-git上傳&#xff08;簡易版&#xff09;首先&#xff0c;記得vscode打開的項目路徑是/home/Agribrain。不然會提示上傳很多項目無關的文件。① 暫存所有更改②使用vscode終端注意&#xff1a;終端打開路徑&#xff1a;/home/Agribrain/agribrain【git項目的所在目錄】&#x…

什么是數據集成?數據集成對數據治理有什么影響

在大數據與人工智能驅動的時代&#xff0c;數據已經成為企業的“新型生產力”。然而&#xff0c;企業內部數據往往分散在不同系統、不同格式、甚至不同地域中。如果缺乏有效管理與整合&#xff0c;數據價值就無法真正釋放。這時&#xff0c;“數據集成”應運而生&#xff0c;它…

技術成長戰略是什么?

文章目錄技術成長戰略是什么&#xff1f;1. 前言2. 跟技術大牛學成長戰略2.1 系統性能專家案例2.2 從開源到企業案例2.3 技術媒體大V案例2.4 案例小結3. 學習金字塔和刻意訓練4. 戰略思維的誕生5. 建議技術成長戰略是什么&#xff1f; 1. 前言 在波波的微信技術交流群里頭&am…

從0到1打造一臺機器人走起來

聚焦仿人雙足機器人,著重解決其下肢魯棒行走中仿真到實機間隔(SimToReal gap)的誤差問題 總述 硬件:采用傅利葉智能科技一體化關節模組: 1)胯部和膝關節選用 FSA80 - 29E 電機,以承受較大扭矩; 2)大腿部分采用 FSA60 - 43E 電機,兼顧扭矩和轉速需求; 3)小腿選用 …

【Cmake】Cmake概覽

目錄 一.環境準備 1.1.Cmake安裝 1.2. VSCodeCMake插件安裝 1.3 快速樣例-helloworld?程 二. cmake的基礎命令?使用示例 2.1.文件準備 2.2.?成構建系統 2.3.編譯連接 2.4.測試Ctest模塊 2.5.測試安裝模塊 2.6.測試打包模塊 2.7 查看幫助 CMake語法簡潔清晰&…

概率核心概念學習筆記:隨機事件與樣本空間、古典概率與條件概率、全概率公式與貝葉斯公式

目錄 一、 隨機事件與樣本空間 1. 原理講解 2. 類型與關系 3. 案例計算 4. 應用場景 二、 古典概率與條件概率 1. 古典概率 (Classical Probability) 2. 條件概率 (Conditional Probability) 三、 全概率公式與貝葉斯公式 1. 全概率公式 (Law of Total Probability) …

優考試局域網系統V6.0.0版

優考試局域網系統迎來V6.0.0版本更新&#xff0c;核心在于提升功能性能與優化操作體驗。重點對學情分析、移動端考試支持、考試監控和答題體驗等方面進行了實用性更新&#xff0c;進一步提升了局域網環境下考試系統的靈活性與管理效率。 一、增加學情分析功能&#xff0c;教學…

Autosar之Com模塊

Com模塊主要實現了Signal在I-PDU中的封裝及解析功能,為RTE層提供了基于Signal的發送與接收接口,實現了基于Signal的網關功能,實現了PDU的不同發送模式,以及Signal濾波,Update bit,Pdu Counter等功能 圖 Com模塊層次圖 Com模塊處于AUTOSAR架構中的通信服務層,其下層模塊…

【iOS】NSRunLoop

目錄 概念 RunLoop與線程的關系 Runloop對外的接口 CFRunLoopSourceRef Source0 Source1 CFRunLoopTimer CFRunLoopObserver RunLoop的Mode 應用場景 Runloop的內部邏輯 Runloop應用 tableView延遲加載圖片&#xff0c;保證流暢 Timer不被ScrollView的滑動影響 A…

HTTP接口鑒權方式

幾種主流且可行的HTTP接口鑒權方式&#xff0c;從簡單到復雜&#xff0c;各有其適用場景。我將它們分為兩大類&#xff1a;傳統方式和現代方式。一、傳統方式這類方式簡單易用&#xff0c;但通常安全性較低或擴展性較差&#xff0c;適用于內部系統或簡單API。1. HTTP Basic Aut…

DIC技術極端環境案例分享:系泊鏈在海水環境下氫脆化性能測試

實驗結果的具體視頻可詳見以下鏈接&#xff1a;研索儀器DIC技術在極端條件下的應用 01 海水環境&#xff1a; DIC技術在海水環境下的應用核心挑戰在于惡劣的光學條件&#xff08;如散射、衰減、畸變&#xff09;、嚴酷的化學/生物環境&#xff08;腐蝕、生物污損&#xff09;…

DL00291-聯邦學習以去中心化鋰離子電池健康預測模型完整實現

聯邦學習在鋰離子電池健康預測中的應用&#xff1a;去中心化訓練與客戶選擇策略在鋰離子電池健康預測領域&#xff0c;隨著電池使用環境的多樣化以及電池狀態監測需求的不斷增長&#xff0c;傳統的集中式數據訓練方法逐漸顯現出局限性。為了解決數據隱私保護和大規模數據集中處…

TCP協議大全

什么是TCP&#xff1f;基本定義與屬性TCP&#xff08;傳輸控制協議&#xff09;是傳輸層的重要協議&#xff0c;具有面向連接&#xff08;傳輸前需先建立連接&#xff0c;是發送方和接收方的點對點一對一連接&#xff09;、基于字節流&#xff08;以字節流形式傳輸數據&#xf…

當硅基生命遇見碳基萌寵:Deepoc具身智能如何重新定義“寵物監護者”

在東京某高級公寓里&#xff0c;一只布偶貓正優雅地踱步到智能喂食器前。令人驚訝的是&#xff0c;這個通體雪白的喂食器突然"活"了過來——它微微傾斜身體&#xff0c;用柔和的機械音發出問候&#xff0c;同時伸出仿生機械臂輕輕撫過貓咪的背部。這不是科幻電影場景…

線上日志排查問題

1、查異常堆棧 顯示該行及其后面的50行內容&#xff0c;然后通過 less 命令進行分頁查看 grep -A 50 "NullPointerException" a.log | less參數解釋&#xff1a; grep: 文本搜索命令-A 50: After 的意思&#xff0c;顯示匹配行后面的50行“NullPointerException”: 要…

LabVIEW與CAN開發燃料電池監控

?基于 LabVIEW 與 CAN 總線技術&#xff0c;構建了一套多組質子交換膜燃料電池&#xff08;PEMFC&#xff09;堆監控系統。系統采用優質硬件設備&#xff0c;通過 LabVIEW 的圖形化編程能力實現數據采集、實時監控與多堆切換控制&#xff0c;穩定可靠&#xff0c;為燃料電池性…

CVPR焦點 | 神經網絡新范式:輕量化與精度并行,重塑視覺任務性能天花板

關注gongzhonghao【CVPR頂會精選】神經網絡卷積想找新亮點&#xff1f;不妨考慮&#xff1a;動態結構設計。作為深度學習架構搜索與高效建模兩大熱點的結合&#xff0c;動態神經網絡憑借自適應推理與高效特征利用的優勢&#xff0c;在視覺識別、視頻理解等任務中脫穎而出&#…

機器學習之集成算法學習

一、集成學習概述集成學習&#xff08;ensemble learning&#xff09;通過構建并結合多個個體學習器來完成學習任務&#xff0c;核心思想是 “集眾家之長”—— 就像多個專家共同判斷往往比單個專家更可靠。其關鍵在于如何生成多樣化的個體學習器并設計有效的結合策略。結合策略…

Unreal Engine UE_LOG

Unreal&#x1f3ae; Unreal Engine - UE_LOG&#x1f4dd; 定義&#x1f3db; 類/宏關聯? 關鍵特性&#x1f6e0;? 常見配置&#x1f4da; 使用方法&#x1f527; 基礎語法&#x1f50d; 示例&#x1fa82; 典型應用場景&#x1f517; 與其他組件對比?? 常見問題與注意事項…

Halcon那些事:什么是動態閾值,如何用dyn_threshold分割圖片

Halcon那些事:什么是動態閾值,如何用dyn_threshold分割圖片 一、什么是動態閾值?為什么需要它? 1. 傳統全局閾值的局限性 2. 動態閾值的核心思想 二、Halcon 中的核心算子:`dyn_threshold` 1. 算子原型 2. 參數詳解 三、工作原理(數學模型) 四、詳細使用步驟與實例 五、關…