如何使用dlsym在lua库中调用函数

我在尝试调用一个 Lua 库运行时, 因此我写了一个用 C 实现的 Lua 库。

static int my_new(lua_State *L) {
  printf("test_new");
}

LUALIB_API int luaopen_my(lua_State *L) {
  static const luaL_Reg R[] =
  {
  { "new",                        my_new },
  { NULL,                         NULL }
  };

  luaL_newmetatable(L,myNAME);
  luaL_setfuncs(L,R,0);
  lua_pushliteral(L,"version");                  /** version */
  lua_pushliteral(L,MYVERSION);
  lua_settable(L,-3);
  lua_pushliteral(L,"__index");
  lua_pushvalue(L,-2);
  lua_settable(L,-3);
  return 1;
}

所以我将其构建为一个动态库,然后尝试调用它:

void *handle;
lua_CFunction fnc_call;

handle = dlopen("mylib.so", RTLD_LOCAL | RTLD_LAZY);
if (!handle) {
  printf("error call lib");
  exit(-1);
}

fnc_call = (lua_CFunction) dlsym(handle, "luaopen_my");
if (fnc_call == NULL)  {
  printf("error call func");
  exit(-1);
}

luaL_requiref(L, "my", fnc_call, 1);
lua_pop(L, 1);

但是当我调用使用它的 Lua 代码时,出现了分段错误。

test = my.new()

我应该如何在程序中调用 Lua 库,我知道可以将我的库放在某个 Lua 路径中,然后使用 lua api 调用我的库,但我需要使用 dlopen 调用它。

谢谢,

点赞
用户869951
用户869951

我打赌,因为你没有从 my_new 返回一个值,函数会返回一个随机值告诉 Lua 有一些(可能非常高的)对象返回到堆栈中。由于这不是真实的情况,当 Lua 清除返回值的栈时,它删除了堆栈中的对象,尽管没有添加任何对象,很可能会移除比堆栈中实际有的更多对象,因此破坏了内存。

my_new 中加入 return 0

2014-05-18 02:20:52