【问题标题】:"require" not work in embeded lua“要求”在嵌入式 lua 中不起作用
【发布时间】:2014-04-04 22:42:43
【问题描述】:

在这段代码中,我加载并运行test.lua 文件

int main (){
    L = luaL_newstate();
    luaL_openlibs(L);
    luaL_dofile(L, "test.lua");
    lua_close(L);
    return 0;
}

我的 test.lua 文件内容

print ("s1");
r=require 'simple';
print ("s2");

simple 模块是之前安装的

当运行 ./lua_c ;输出只有:s1

但是当运行lua test.lua;输出是

s1
s2

r 不是零

【问题讨论】:

  • 您的simple.lua(或simple.so)在哪里?
  • 显然没有找到“简单”。这是关于您的环境的问题,而不是代码。
  • @Egor:我的 lua 版本是 5.2,我在所有路径中复制 simple.so:/usr/local/lib/lua/5.2/?.so;/usr/local/lib/lua/5.2/loadall.so;./?.so
  • @Mud: 为什么 lua 会找到它?!?!
  • .so 文件的权限设置是否正确?

标签: lua lua-5.2


【解决方案1】:

simple 无法加载、解析或执行。要查找问题,请使用luaL_loadfile 而不是luaL_dofile 并检查返回值。如果非零,则存在加载错误,您可以从 Lua 堆栈中弹出并打印。如果没有错误,请执行lua_pcall(L, 0, LUA_MULTRET, 0)) 运行由 loadfile 创建的卡盘,并再次检查返回码是否有错误,弹出堆栈并打印。应该是这样的:

int main ()
{
    L = luaL_newstate();
    luaL_openlibs(L);

    if (luaL_loadfile(L, "test.lua"))
    {
         cout << "Error: " << lua_tostring(L, -1) << endl;
    }
    else if (lua_pcall(L, 0, LUA_MULTRET, 0))
    {
         cout << "Error: " << lua_tostring(L, -1) << endl;
    }
    else
    {
         // call successful
    }

    lua_close(L);
    return 0;
}

更新:现在您从错误消息中知道 simple.so 具有未定义的符号:lua_gettop,您知道存在链接错误。也许simple.so 没有链接到lua51.so,但是由于它可以从链接到lua lib 的lua.exe 工作,所以它可以在你的应用程序中工作,这肯定也链接到它。另一种可能性是 lua.exe 是静态链接的,但 simple.so 没有链接。验证 simple.so 是否链接到 lua51.so 并且它链接到的库可以通过 LD_LIBRARY_PATH 找到。验证 lua.exe 是否链接到相同的 .so。

【讨论】:

  • luaL_loadfile 返回零值
  • 好的,加载正常;如上所述,然后运行受保护的调用,并且肯定会返回非零
  • 但是为什么lua 可以毫无问题地运行require simple.so 呢? ,在我的代码中,我可以加载simple.lua,但无法加载simple.so
  • @ChiChak 现在,这是任何人的猜测。 pcall 返回的错误会告诉你。
  • @ChiChak 完全正确,如果它返回 2 则表示有错误。我已经扩展了答案以显示如何打印它。
猜你喜欢
  • 2021-03-23
  • 1970-01-01
  • 2019-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多