模块加载错误(Lua)

3
我在运行应用程序时遇到了一个问题,错误提示为: loop or previous error loading module 'socket'
导致此错误的代码是: socket = require("socket")
这个错误发生在第一个lua_pcall期间。以下是调用该函数的功能:
void startTerminal(int port, char host[80])
{
    lua_State *L = lua_open();

    /* Open Lua Library */
    luaL_openlibs(L);

    /* Choose the lua file that will run */
    if(luaL_loadfile(L, "socket.lua")) {
        lfatal(L, "luaL_loadfile() failed");
    }

    /* Start lua file */
    if(lua_pcall(L, 0, 0, 0)) {
        lfatal(L, "lua_pcall()");
    }

    /* Get connect function */
    lua_getglobal(L, "connect");

    if(!lua_isfunction(L, -1)) {
        lua_pop(L, 1);
        lfatal(L, "lua_isfunction() failed");
    }

    /* Setup arguments */
    lua_pushnumber(L, port);
    lua_pushstring(L, host);

    /* Call the lua function */
    if(lua_pcall(L, 2, 2, 0)) {
        lfatal(L, "lua_pcall() failed");
    }

    /* Print out results */
    printf("%s", lua_tostring(L, -1));
    printf("%s", lua_tostring(L, -1));

    lua_close(L);
}

这是我编译代码的方式:
gcc -Wall -o terminal attacker.c -I/usr/include/lua5.1 -llua5.1 -lm
在编译过程中,我是否漏掉了一些开关或库?
注意: 编译器没有抛出任何错误,且编译干净。 在其他不包含C语言的Lua应用程序中,我使用 require("socket") 没有任何问题。
谢谢。
1个回答

7
luaL_loadfile(L, "socket.lua")

这很可疑。非常可疑。
使用标准的Lua加载器时,当您发出require("MODULE_NAME")时,它将首先查找(在检查是否已加载MODULE_NAME之后)的是"MODULE_NAME.lua"。在当前目录下。这肯定存在。它被称为socket.lua,就是您加载并尝试执行的文件。因此,它将尝试将socket.lua作为模块进行加载。
而且,由于socket.lua中有require("socket"),所以它会再次加载自己。一遍又一遍。
嗯,它不会这样做,因为Lua的包装载器系统足够聪明,可以检测到循环并发出错误。这正是它所做的。
因此,如果您确实要使用该名称的模块,请不要将文件命名为MODULE_NAME.lua

非常感谢。我没有意识到那正在发生。 - koralarts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接