【问题标题】:Error loading module undefined symbol: luaL_setfuncs加载模块未定义符号时出错:luaL_setfuncs
【发布时间】:2014-02-13 22:48:19
【问题描述】:

我正在尝试创建一个要从 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

我真的迷失了自己做错了什么。

【问题讨论】:

  • 你确定在运行 Lua 5.2 吗?我不是指您在 g++ 中链接到的库,我的意思是您在哪里运行执行 require? 的脚本
  • 我已经卸载了 Lua 5.1。我在系统上拥有的唯一 LUA 二进制文件是 Lua 5.2。我不太确定什么或如何调用 mysql-proxy。我试图包含命令 print("VERSION ", lua_version()) 但我得到一个错误 `attempt to call global 'lua_version' (a nil value)'
  • lua -v 打印什么?
  • C++中定义的luacall数组是什么?
  • luacall 是我要调用的库的名称。我不确定是否理解数组问题。

标签: c lua lua-api


【解决方案1】:

在构建 Lua 模块时不要使用-llua。 Lua 解释器本身已经与 liblua 链接,并在加载模块时满足这些符号。将您的模块与 liblua 链接会与解释器发生冲突。

【讨论】:

    【解决方案2】:

    我想我找到了问题(尚未解决):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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-15
      • 2016-10-16
      • 1970-01-01
      • 2019-12-09
      • 2012-10-13
      • 1970-01-01
      • 2020-09-30
      • 1970-01-01
      相关资源
      最近更新 更多