当前位置: 首页 > 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.lryc.cn/news/602244.html

相关文章:

  • 最新的前端技术和趋势(2025)
  • Maven中的bom和父依赖
  • Nginx HTTP 反向代理负载均衡实验
  • YOLO11 改进、魔改|低分辨率自注意力机制LRSA ,提取全局上下文建模与局部细节,提升小目标、密集小目标的检测能力
  • 免费 SSL 证书申请简明教程,让网站实现 HTTPS 访问
  • ADAS测试:如何用自动化手段提升VV效率
  • 【CDA干货】金融超市电商App经营数据分析案例
  • unbuntn 22.04 coreutils文件系统故障
  • GaussDB as的用法
  • 亚马逊广告关键词优化:如何精准定位目标客户
  • MyBatis中#{}与${}的实战避坑指南
  • 性能测试-技术指标的含义和计算
  • Leetcode_242.有效的字母异位词
  • Apache Commons VFS:Java内存虚拟文件系统,屏蔽不同IO细节
  • python入门篇12-虚拟环境conda的安装与使用
  • 深入Go并发编程:Channel、Goroutine与Select的协同艺术
  • 博士申请 | 荷兰阿姆斯特丹大学 招收计算机视觉(CV)方向 全奖博士生
  • 达梦有多少个模式
  • 亚马逊地址关联暴雷:新算法下的账号安全保卫战
  • 四、计算机组成原理——第6章:总线
  • 基于Hadoop3.3.4+Flink1.17.0+FlinkCDC3.0.0+Iceberg1.5.0整合,实现数仓实时同步mysql数据
  • [VLDB 2025]面向Flink集群巡检的交叉对比学习异常检测
  • SVN与GIT的区别,分别使用与哪些管理场景?
  • Go-Elasticsearch Typed Client查询请求的两种写法强类型 Request 与 Raw JSON
  • 正则表达式 速查速记
  • 10、Docker Compose 安装 MySQL
  • flink yarn 问题排查
  • 同态滤波算法详解:基于频域变换的光照不均匀校正
  • 第4章唯一ID生成器——4.3 基于时间戳的趋势递增的唯一ID
  • 测试用例设计常用方法