LuaBridge使用

LuaBridge使用

目的

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

Lua编译

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

add_definitions(-DLUA_USE_DLOPEN)

源码的文件分为三种

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

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

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++函数在这里写

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中,注册形式如下

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();
}

关于智能指针的导出

// 先搞个函数,返回智能指针
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 @ 2023-03-10 16:33  zongzi10010  阅读(389)  评论(0编辑  收藏  举报