1

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

4

1 回答 1

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 并且可以找到它链接到的库,例如 via LD_LIBRARY_PATH。验证 lua.exe 是否链接到相同的 .so。

于 2014-04-04T23:47:12.127 回答