2

lua スクリプトから呼び出される C モジュールを作成しようとしています。私はdebian Linuxに取り組んでいます。私は mysql-proxy と lua 5.2 を使用しています。呼び出される関数の例をいくつか作成しました (チュートリアルからコピー)。

ローダーは次のように定義されます。

int luaopen_luacall(lua_State* l)
{

    luaL_newlibtable(l, luacall);
    luaL_setfuncs(l, luacall, 0);
    return 1;
}

これを lua から呼び出すには、次のコードを使用します。

luacall = require("luacall")
local f = luacall.fun1()

このコマンドでコンパイルしました:

g++ -shared -Wl,-E,-soname,libluacall.so -o luacall.so luacall.c  -fPIC -llua -ldl

スクリプトを実行しようとすると、requireコマンドで次のエラーが発生します。

 error loading module 'luacall' from file '/usr/lib/mysql-proxy/lua/luacall.so':
        /usr/lib/mysql-proxy/lua/luacall.so: undefined symbol: luaL_setfuncs

私は自分が間違っていることに本当に迷っています。

4

2 に答える 2

3

私は問題を見つけたと思います (まだ解決策ではありません): Mysql-proxy は、埋め込まれた lua ライブラリを内部で実行します。

mysql-proxy -V

結果として与える

mysql-proxy 0.8.1
  chassis: mysql-proxy 0.8.1
  glib2: 2.30.2
  libevent: 2.0.19-stable
  LUA: Lua 5.1.4
    package.path: /usr/lib/mysql-proxy/lua/?.lua
    package.cpath: /usr/lib/mysql-proxy/lua/?.so
-- modules
  admin: 0.8.1
  proxy: 0.8.1

そのため、間違った lua バージョンを実行しています。これで luaL_setfuncs エラーが説明できると思います。バージョン 0.8.4 にもこのバージョンの lua が含まれていることがわかったので、C ライブラリを書き直す必要があります。

モジュールの最終的なコードは次のように終了します (そして実行されます!!!):

static const struct luaL_Reg my_luacall[] = {
    {"trasnquery", trasnquery},
    {"fun2", function_2},
    {NULL, NULL}
};

int luaopen_luacall(lua_State* l)
{
    luaL_register(l, "luacall", my_luacall);
    return 1;
}
于 2014-01-24T09:16:35.700 に答える