Search code examples
clualua-api

Error loading module undefined symbol: luaL_setfuncs


I am trying to create a C module to be called from a lua script. I am working on debian linux. I am using mysql-proxy and lua 5.2. I have created (copied from a tutorial) some example functions to be called.

The loader is defined like this:

int luaopen_luacall(lua_State* l)
{

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

To call this from lua I use this code:

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

I have compiled it with this command:

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

When I try to run the script I get the following error on the require command:

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

I am really lost on what I am doing wrong.


Solution

  • I think I found the problem (not yet the solution): Mysql-proxy runs internally an embended lua library.

    mysql-proxy -V
    

    gives as result

    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
    

    So I am running the wrong lua version. I think that this explains the luaL_setfuncs error. I have seen that even the 0.8.4 version includes this version of lua, so I will have to rewrite the C library.

    the final code of the module ends like this (and runs!!!):

    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;
    }