LuaBridge使用
LuaBridge使用
目的
把已有的C++
的动态库导出给lua
脚本使用
Lua编译
我们的lua
需要编译动态库供以后的CPP
的动态库使用,需要添加一个编译选项
add_definitions(-DLUA_USE_DLOPEN)
源码的文件分为三种
lua.c
执行文件luac.c
,Lua
编译器,luac
就是把lua
转换成二进制- 其他
我们编译动态库只需要把其他文件都编译进去就行了
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);