bLua 正在参加 2021 年度 OSC 中国开源项目评选,请投票支持!
bLua 在 2021 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
2021 年度 OSC 中国开源项目评选 正在火热进行中,快来投票支持你喜欢的开源项目!
2021 年度 OSC 中国开源项目评选 >>> 中场回顾
bLua 获得 2021 年度 OSC 中国开源项目评选「最佳人气项目」 !
授权协议 MIT
开发语言 C/C++ Lua
操作系统 跨平台
软件类型 开源软件
开源组织
地区 国产
投 递 者 SHFUITCK
适用人群 未知
收录时间 2023-04-13

软件简介

bLua 是 C++与Lua的胶水层,b代表着bridge

特性

  • 依赖C++17
  • 只有一个头文件
  • 接口简单轻量
  • 完全隔离,无侵入
  • userdata的方式管理c++指针生命周期

用法

lua调用c++

首先注册类及需要的成员函数

// 注册全局函数
bLua::reg_global_func(L, "newA", newA);
bLua::reg_global_func(L, "printA", printA);

// 注册类函数
bLua::reg_class<A>(L);
bLua::reg_class_func(L, "get_this", &A::get_this);
bLua::reg_class_func(L, "get_int", &A::get_int);
bLua::reg_class_func(L, "set_int", &A::set_int);
bLua::reg_class_func(L, "get_string", &A::get_string);
bLua::reg_class_func(L, "set_string", &A::set_string);

然后在lua中使用即可

-- 创建一个对象
local a = newA()

-- 调用对象函数
a:set_int(123)
print("a:get_int() ", a:get_int())

-- 调用对象函数
a:set_string("abc")
print("a:set_string() ", a:get_string())

c++调用lua

c++调用lua全局函数

// 多个返回值
int output_int = 0;
std::string output_str;
uint64_t output_int64 = 0;

// 输入参数
int input_int = 123;
std::string input_str = "test";

// 调用
auto err = bLua::call_lua_global_func(L, "global_func_name", 
    std::tie(output_int, output_str, output_int64), 
    input_int, input_str);

// 调用是否成功
if (err) {
    // 出错,输出错误信息
    printf("ret error %s\n", err.value().c_str());
} else {
    // 成功则输出函数返回结果
    printf("%d %s %llu\n", output_int, output_str.c_str(), output_int64);
}

如果lua的函数在一层层table中,例如

function _G.test.func.test(a, b)
    return a - b
end

那么c++调用lua嵌套的table函数

// 调用
auto err = bLua::call_lua_table_func(L, {"_G", "test", "func"}, "test", 
    std::tie(output_int, output_str, output_int64), 
    input_int, input_str);

具体例子可以参考test目录的test.cpp和test.lua

编译

# mkdir build
# cd build
# cmake ..
# make

运行test程序

# ./bLua 

 

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论

点击引领话题📣 发布并加入讨论🔥
暂无内容
发表了博客
{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}
{{parseInt(o.viewCount) | bigNumberTransform}}
没有更多内容
暂无内容
发表了问答
{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}
{{parseInt(o.viewCount) | bigNumberTransform}}
没有更多内容
暂无内容
暂无内容
0 评论
3 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部