LuaBridge使用

LuaBridge使用

目的#

把已有的C++的动态库导出给lua脚本使用

Lua编译#

我们的lua需要编译动态库供以后的CPP的动态库使用,需要添加一个编译选项

Copy
add_definitions(-DLUA_USE_DLOPEN)

源码的文件分为三种

  1. lua.c 执行文件
  2. luac.c , Lua编译器,luac就是把lua转换成二进制
  3. 其他

我们编译动态库只需要把其他文件都编译进去就行了

Copy
if(WIN32) add_definitions("-DLUA_BUILD_AS_DLL") add_definitions( -D_CRT_SECURE_NO_WARNINGS ) endif(WIN32) add_definitions(-DLUA_USE_DLOPEN) aux_source_directory(. LUA_SOURCES) list(REMOVE_ITEM LUA_SOURCES "./lua.c" "./luac.c") message(${LUA_SOURCES}) set(LUA_LIBRARY lualib) add_library(${LUA_LIBRARY} SHARED ${LUA_SOURCES}) add_executable(mylua lua.c) target_link_libraries(mylua ${LUA_LIBRARY} m dl) add_executable(myluac ${LUA_SOURCES} luac.c) target_link_libraries(myluac m dl)

动态库符号导出#

参考连接

动态库的约定: 所有的可被lua调用的函数,需要参数是lua_State* ,我们在lua调用require xxx的时候,lua回去调用一个名为luaopen_xxx的函数,所以可以理解为动态库的入口函数,我们需要把需要绑定的C++函数在这里写

Copy
int luaopen_xxx(lua_State* L) { luaL_Reg l[] = { { "add", &fun }, { NULL, NULL }, }; luaL_checkversion(L); luaL_newlib(L,l); return 1; }

LuaBridge使用#

单个头文件依赖,支持c11,注意LuaBridge3不支持,符号的导出依然是写到luaopen_xxx中,注册形式如下

Copy
extern "C" { #include <lua.h> #include <lauxlib.h> #include <lualib.h> } #include "LuaBridge/LuaBridge.h" // 这个函数要被luaopen_xxx调用 void register_xxx (lua_State* luaState) { luabridge::getGlobalNamespace(luaState) .beginClass<Greeter>("Greeter") .addConstructor<void(*) (const std::string&)>() .addFunction("getName",&Greeter::getName) .addFunction("printName", &Greeter::printName) .endClass(); }

关于智能指针的导出

Copy
// 先搞个函数,返回智能指针 std::shared_ptr<ABC1> foo() { return std::make_shared<ABC1>(); } // 再在register_xxx 注册 // lua 中使用 // local ptr=getAbcPtr() // c:testptr(ptr) // luabridge::getGlobalNamespace(luaState) .beginClass<std::shared_ptr<ABC1>>("ABC1Ptr") .endClass().addFunction("getAbcPtr",&foo);

仓库参考#

https://gitee.com/layty/lua-bridge-demo

posted @   zongzi10010  阅读(556)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示
CONTENTS