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

C/C++ 调用lua脚本,lua脚本调用另一个lua脚本

文件内容

Main.lua , 被c/c++调用的lua

print("hello world")-- 引入其他模块
--dofile("module.lua")-- require函数用于引入其他模块, 以下2种引入方式都可以
--require("module")
require "module"print("hello world")-- 单行注释--[[
多行注释
]]---- 全局变量
a = 1;-- 局部变量
local aa = 1;-- 数据类型
local num = 1 -- number
local num = 1.0009999 -- number
local str = "hello" -- string
local bool =  false -- boolean
local bool =  {"1","2"} -- table
local nil_var = nil -- nil 表示无效的值,和java的null 有区别,相当于java的false
local invalid_var -- 当一个变量未赋值,它的默认值就是 nil-- type 函数,输出对象的类型
print(type("i love you"))  -- string
print(type(false)) -- boolean
print(type(nil)) -- nil
print(type(1)) -- number
print(type(1.111)) -- number
print(type(type)) -- function-- if语法
if true thenprint("条件为真")
end-- if else
if false thenprint("条件为真")
elseprint("条件为假")
end-- if else if
local ifA = 21;
if ifA == 1 thenprint("为1")
elseif ifA == 2 thenprint("为2")
elseif ifA == 3 thenprint("为4")
elseprint("啥也不是")
end-- while 循环
local num = 0;
while (num < 20) -- while判断条件为ture时会一直执行do循环体的语句
doprint("current num"..num)num =num+1
end-- for循环
-- i=1 : 声明变量
-- 10: i只要不超过10,就会一直执行do循环体的语句,
-- 2: i每次递增的数量
for i = 1, 10 ,2
doprint("i的值为"..i)
end-- repeat ..until() 满足条件结束
local c = 1
repeatprint("c的值:"..c)c = c+1
until(c<10) -- 当条件为true时结束循环,否则一直执行循环体的内容-- 函数
function add(a,b)return a + b
end
print(add(1,2))-- 两个点 .. 表示拼接
print("hello".." world!!!!")
local age = 6
print("我已经"..age.."岁了")-- 不能拼接nil值,会报错
local nil_con = nil
--print("nil_con的值为:"..nil_con)-- 表 可以当数组用,也可以当 map 或对象来用local table = {} -- 初始化表
table[1] = 1 --给表赋值
table["key"] = "val"
-- 表取值
print("1的位置值为:"..table[1])
print("key的位置值为:"..table["key"])
--print("key1的位置值为:"..table["key1"]) -- 获取一个不存在的值会报错
-- 移除引用
table = nil--print("1的位置值为:"..table[1])-- 因为上面已经移除了表的引用,在这里取值会报错-- 调用模块的函数
module.fun("yexindong")-- 打印模块的常量
print(module.constant)

module.lua , 被lua调用的lua模块

-- 模块-- 模块相当于一个封装库, 也可以理解为是java的一个class
-- 从 Lua 5.1 开始,Lua 加入了标准的模块管理机制,可以把一些公用的代码放在一个文件里,以 API 接口的形式在其他地方调用,有利于代码的重用和降低代码耦合度-- 定义一个名为module的模块
module = {}-- 定义一个常量
module.constant = "this is constant"-- 定义私有函数,只能在内部调用
local function private_func(a)print("调用了私有函数"..a)
end-- 定义一个函数
function module.fun(a)print("a的值为:"..a)private_func(a)
end-- 一定要return出去,否则其他地方无法调用
return module

main.c , c语言入口

#include <stdio.h>
#include  <lua.h>
#include  "lualib.h"
#include  "lauxlib.h"
int main() {printf("Hello, World!\n");lua_State* L;L = luaL_newstate(); /* 创建lua状态机 */printf("L:%p\n",L);luaL_openlibs(L); // 打开Lua标准库// 调用lua脚本,Main.lua 又调用了另一个lua脚本// 通过 dofile 或者 require引入都可以调用另一个脚本,前提是这2个脚本必须放在一起,且必须和 mian 函数打包后的可执行文件放在一起,否则会报错,找不到 moduleif (luaL_dofile(L, "Main.lua") != LUA_OK) {printf("Error: %s\n", lua_tostring(L, -1));return 1;}lua_close(L); // 关闭Lua状态机return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.23)
project(untitled C)set(CMAKE_C_STANDARD 11)add_executable(untitled main.c)
target_link_libraries(untitled  -llua -ldl -lm)# 复制文件到项目的根目录
configure_file( Main.lua Main.lua COPYONLY)
configure_file( module.lua module.lua COPYONLY)# 注意:一定要加到最后面
target_include_directories(untitled PUBLIC /usr/local/include/)

文件目录

文件目录如下,一定要将所有文件都放在同一个目录下

project└--cmake-build-debug└--CMakeLists.txt└--main.c└--Main.lua└--module.lua

开始执行

生成 Makefile

cmake .

编译

make

编译后可执行文件和lua脚本是放在一起的,这也是我想要的,必须要放在一起,否则执行会报错;

ot@PAw9033927:/tmp/tmp.TYQSMrDA9B/cmake-build-debug# ls -l
total 732
-rw-r--r-- 1 root root  23927 Apr 25 16:46 CMakeCache.txt
drwxr-xr-x 1 root root   4096 Apr 28 15:46 CMakeFiles
-rw-r--r-- 1 root root   2794 Apr 28 15:44 Main.lua    // lua脚本文件
-rw-r--r-- 1 root root   5260 Apr 28 15:44 Makefile
drwxr-xr-x 1 root root   4096 Apr 25 16:47 Testing
-rw-r--r-- 1 root root   1631 Apr 25 16:46 cmake_install.cmake
-rw-r--r-- 1 root root    865 Apr 25 16:46 module.lua  // lua脚本文件
-rwxr-xr-x 1 root root 303688 Apr 28 15:44 untitled  // 可执行文件
-rw-r--r-- 1 root root   4948 Apr 28 15:44 untitled.cbp
http://www.dtcms.com/a/302655.html

相关文章:

  • Rastrigin函数简介
  • Revo Uninstaller Pro专业版领取:2025最佳Windows软件卸载工具
  • org.hibernate.hql.internal.ast.QuerySyntaxException: Invalid path
  • 数据结构之顺序表链表栈
  • 设计模式(十六)行为型:解释器模式详解
  • LeetCode 2044题:统计按位或能得到最大值的子集数目(原创)
  • RabbitMQ概念与管理端配置说明
  • Ubuntu “apt”安装
  • 【Apache Tomcat】
  • Thymeleaf语法大全:30个实用示例
  • UE5 UI自适应 DPI缩放
  • 分布式微服务--核心组件与架构关系(一)
  • 前端面试题--副本
  • 【n8n教程笔记——工作流Workflow】文本课程(第一阶段)——5.7 调度工作流 (Scheduling the workflow)
  • <PLC><西门子><modbusTCP>在西门子S7-1200系列PLC中,如何设置modbusTCP通讯?
  • 深度学习核心模型架构解析:Transformer自注意力机制与Query-Key-Value投影的向量空间几何解释
  • 【GitHub Workflows 基础(一)】认识 .github/workflows/ 下的多个工作流
  • ubuntu qt环境下出现No suitable kits found解决方案
  • 国产化PDF处理控件Spire.PDF教程:Java 提取 PDF 图片,高质量提取与图片过滤技巧
  • ros2的package.xml和rosdep
  • 青少年编程高阶课程介绍
  • LangGraph智能体(天气和新闻助手)开发与部署
  • 嵌入式Linux:注册线程清理处理函数
  • 墨者:SQL过滤字符后手工绕过漏洞测试(万能口令)
  • 婚纱摄影管理系统(发送邮箱、腾讯地图API、物流API、webSocket实时聊天、协同过滤算法、Echarts图形化分析)
  • Android15广播ANR的源码流程分析
  • 【Unity】Application类常见路径一览表
  • 05 OpenCV--图像预处理之图像轮廓、直方图均衡化、模板匹配、霍夫变化、图像亮度变化、形态学变化
  • Jenkins流水线部署+webhook2.0
  • Rust/Tauri 优秀开源项目推荐