问题
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.
回答1:
Never use -llua
when building Lua modules. The Lua interpreter itself is already linked with liblua and satisfies those symbols when the module is loaded. Linking your module against liblua is clashing with the interpreter.
回答2:
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;
}
来源:https://stackoverflow.com/questions/21307312/error-loading-module-undefined-symbol-lual-setfuncs