在lua中载入C++模块时出现了“尝试索引字符串值”的错误

我正在尝试从lua中使用一个C++编写的函数。以下是cpp文件:

extern "C"
{
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}

static int add_5(lua_State *L)
{
  double d = lua_tonumber(L, 1); /* 获取参数 */
  d = d+5;
  lua_pushnumber(L, d); /* 推送结果 */
  return 1; /* 结果数量 */
}

static const struct luaL_Reg mylib [] =
{
  {"add_5", add_5},
  {NULL, NULL} /* 结束标记 */
};

extern "C"
{
  int luaopen_mylib (lua_State *L)
  {
    //luaL_newlib(L, mylib);
    luaL_register(L, NULL, mylib);
    return 1;
  }
}

我使用以下命令通过g++编译了上述代码:

g++ -shared -o mylib.so test.cpp -fPIC

我在lua解释器上遇到了以下错误:

Lua 5.1.4  版权所有(c) 1994-2008 Lua.org, PUC-Rio
> local temp = require "mylib"
尝试索引字符串值
堆栈回溯:
        [C]: ?
        [C]: in function 'require'
        stdin:1: in main chunk
        [C]: ?

请注意,由于某些原因,我无法升级Lua的版本。

点赞
用户787480
用户787480

luaL_register 的第二个参数是库名。你可以将其设置为 NULL,但这样做的话,luaL_register 将尝试将注册的函数插入到栈顶上的表中(并且在你的代码中,栈顶上没有表)。为了一般情况下注册库,最简单的方法是将你的库名作为第二个参数传递。

请注意,LHF建议 这样做,因为它会自动将库的表放入全局表中,而库的用户可能希望将其仅作为本地变量。另一种方法是在调用 luaL_register(使用 NULL 名称)之前使用 lua_newtable 创建自己的表。

2019-07-31 12:41:55