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