"require" 在嵌入式 Lua 中不起作用。

在这段代码中,我加载并运行 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 不为 nil

点赞
用户869951
用户869951

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
    {
         // 调用成功
    }

    lua_close(L);
    return 0;
}

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

2014-04-04 23:47:12