1

lua ライブラリ ランタイムを呼び出そうとしているので、C で lua lib を作成しました。

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

プログラムで lib lua を呼び出すにはどうすればよいですか。lib をいくつかの lua パスに配置し、lua api で libs を呼び出すことができることはわかっていますが、dlopen を使用して呼び出す必要があります。

ありがとう、

4

1 に答える 1

2

my_newから値を返さないので、関数はランダムな値を返し、スタック上に返されるオブジェクトの数が (ランダムで、おそらく非常に多い) あることを Lua に伝えることに賭けます。これは正しくないため、Lua が戻り値からそのスタックをクリアすると、何も追加されていないにもかかわらずスタックからオブジェクトが削除され、スタック上にあるよりも多くのオブジェクトが削除される可能性が高く、メモリが破損します。

に追加return 0my_newます。

于 2014-05-18T02:20:52.860 に答える