我正在尝试创建一个C模块,以便从lua脚本中调用。我正在开发debian。我使用和Lua5.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我真的不知道我做错了什么。
发布于 2014-01-24 09:16:35
我想我找到了问题(还没有找到解决方案):Mysql在内部运行一个附加的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-03-07 20:06:21
构建Lua模块时永远不要使用-llua。Lua解释器本身已经与liblua链接,并在加载模块时满足这些符号。将模块与liblua连接起来与解释器发生冲突。
https://stackoverflow.com/questions/21307312
复制相似问题