在C中注册一个Lua类

我的 C 代码包括:

/*
** lgamelib.c
** 游戏库
** 请参阅 lua.h 中的版权声明
*/

#include <stdlib.h>
#include <math.h>

#define lgamelib_c
#define LUA_LIB

#include "lua.h"

#include "lauxlib.h"
#include "lualib.h"

static int game_workspace (lua_State *L) {
  lua_pushstring(L, "Workspace");
  return 1;
}

static int game_sound (lua_State *L) {

  return 1;
}

static const luaL_Reg gamelib[] = {
  {"Workspace", game_workspace},
  {"Sound",  game_sound},
  {NULL, NULL}
};

/*
** 打开游戏库
*/
LUALIB_API int luaopen_game (lua_State *L) {
  luaL_register(L, LUA_GAMELIBNAME, gamelib);
  //lua_pushnumber(L, PI);
  //lua_setfield(L, -2, "pi");
  //lua_pushnumber(L, HUGE_VAL);
  //lua_setfield(L, -2, "huge");
  return 1;
}

构建完解决方案后,例如“print(game.Workspace())”会返回“game”为 nil,尽管我已经注册了它。有解决方案吗?我完全卡住了......我认为我需要在某个地方包含 lgamelib.c,但我认为我不需要。

点赞
用户111821
用户111821

在我使用的Lua版本(LuaInterface with lua5.1.1)中,我必须在linit.c的lualibs[]数组中添加新的库。此数组由luaL_openlibs函数调用,然后调用您添加的luaopen_game函数或任何其他库。我不知道这是否是添加库的“正确”方法,但它适用于我的代码。

编辑:经过思考,您不需要必须修改linit.c文件。在创建Lua状态后,您可以手动调用库加载器。

lua_State  *L = lua_open();
lua_pushcfunction(L, luaopen_game);
lua_pushstring(L, "game");
lua_call(L, 1, 0);
2011-10-27 18:56:40