Lua问题 - 在运行之前加载库文件

时间:2016-03-01 15:30:11

标签: c lua

我正在加载要多次运行的Lua脚本和另一个Lua脚本,该脚本充当应该由第一个脚本使用的库。

让HelloWorldAPI.lua:

function HelloWorld()
    return "Hello world"
end

和SomeScript.lua:

HelloWorld()

我按以下顺序做事:

L = luaL_newstate();
luaL_openlibs( L );
luaL_loadfile( L, "HelloWorldAPI.lua" );
luaL_loadfile( L, "SomeScript.lua" );
...
lua_pcall( L, 0, 0, 0 )
...
lua_pcall( L, 0, 0, 0 )
...

(删除了一些代码以保持简单)

但是我正在调整一个错误,说我在调用HelloWorld函数时试图调用nil值。

为什么?

我执行lib脚本时声明的函数应该是全局的,因此可以在SomeScript.lua中使用,对吗?

谢谢。

2 个答案:

答案 0 :(得分:3)

luaL_loadfile();加载并编译一个块,将其置于堆栈顶部,但尚未执行(因此,在第一次调用luaL_loadfile后,函数HelloWorld为< em> not 尚未在全局lua状态中定义。

然后,加载文件SomeScript.lua,该文件现在位于堆栈顶部。对lua_pcall的调用现在在顶部执行此块,它尝试调用(尚未)定义的函数HelloWorld,导致您观察到的错误。

考虑到这一点,这将是正确的顺序:

luaL_loadfile( L, "HelloWorldAPI.lua" );
lua_pcall( L, 0, 0, 0 );
luaL_loadfile( L, "SomeScript.lua" );
lua_pcall( L, 0, 0, 0 );

但是,要加载立即执行文件,您应该使用luaL_dofile

luaL_dofile( L, "HelloWorldAPI.lua" );
luaL_dofile( L, "SomeScript.lua" );

答案 1 :(得分:0)

luaL_loadfile将编译后的脚本作为函数留在堆栈中。

因此,SomeScript.lua的函数位于顶部,HelloWorldAPI.lua的函数位于其下方。