当前位置: 首页 > news >正文

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.xdnf.cn/news/1343071.html

相关文章:

  • ODYSSEY:开放世界四足机器人的探索与操控,助力长范围任务
  • Node.js 开发 JavaScript SDK 包的完整指南(AI)
  • 基于Node.js服务端的社区报修管理系统/基于express的在线报修管理系统
  • 数据工程师——ETL
  • FastText 词向量全景指南(没那么全)
  • 如何创建一个Cloudfalare worker项目?
  • vue-admin-template权限管理
  • 【python】os.makedirs和with open
  • pytorch与mindspore的简单ViT实现
  • 【数据分享】中国371个城市的坡度矢量数据和excel数据
  • uniappx与uniapp的区别
  • 【在ubuntu下使用vscode打开c++的make项目及编译调试】
  • MongoDB 从入门到实践:全面掌握文档型 NoSQL 数据库核心操作
  • 3-2〔OSCP ◈ 研记〕❘ WEB应用攻击▸WEB安全防护体系
  • 云计算学习100天-第27天
  • 嵌入式学习day34-网络-tcp/udp
  • 新手向:用FastAPI快速构建高性能Web服务
  • Codeforces1043 A至F 题解
  • 关于 java+gradle的弹窗多选应用app
  • 【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day10
  • Jmeter自动化性能测试常见问题汇总
  • FileCodeBox 文件快递柜 一键部署
  • 如何在Vscode中配置MCP服务?(包含实例:使用Github Copilot + 高德MCP查询旅游攻略)
  • MiniOB环境部署开发(使用Docker)
  • Logstash——安全与权限管理
  • Adobe Photoshop 2025 版本介绍与使用指南
  • 最新AI赋能Python-GEE遥感云大数据分析、可视化与Satellite Embedding创新应用
  • 【ElasticSearch】使用docker compose,通过编写yml安装es8.15和kibana可视化界面操作,go连接es
  • 企业级大模型解决方案:架构、落地与代码实现​
  • 视觉语言对比学习的发展史:从CLIP、BLIP、BLIP2、InstructBLIP(含MiniGPT4的详解)