我正在阅读项目的一些源代码,这是c ++和lua的组合,它们通过luabind交织在一起。
有一个la.lua文件,其中有一个函数exec(arg)。 lua文件还使用其他lua文件中的函数/变量,因此它在开头的语句中有如下语句
module(..., package.seeall);
print("Loading "..debug.getinfo(1).source.."...")
require "client_config"
现在我想从交互式终端(在linux上)运行la.exec(),但是我得到了错误,比如
attempt to index global 'lg' (a nil value)
如果我想导入la.lua,我会
require "la"
Loading @./la.lua...
./la.lua:68: attempt to index global 'ld' (a nil value)
stack traceback:
./lg.lua:68: in main chunk
[C]: in function 'require'
stdin:1: in main chunk
[C]: ?
我该怎么办?
答案 0 :(得分:0)
嗯,可能出现什么问题?
(真的一般猜测下面,你提供的内容没有太多信息......)
一个选项是您缺少依赖项,因为文件不能正确require
它们所依赖的所有内容。 (如果A取决于& require
B然后C,C取决于B但不require
因为它由A隐式加载,直接加载C将失败。)所以如果你追踪和追踪几个小时修复依赖关系,事情可能会突然发挥作用。
(但是,根据模块的编写方式,如果没有很多的重组,这可能是不可能的。例如,除非你设置package.loaded[
"foo"
]
到 foo
在 foo
中的模块表加载子模板之前,这些子模块不能require
"foo"
。(幸运的是,module
会这样做,在没有经常被遗忘的module
的较新代码中 - 然后你会得到一个无限循环(直到堆栈溢出) foo
加载其他模块加载 foo
加载其他模块......) “修复”因为它们加载到解释器中你可能会意外地破坏程序/库在正常操作下使用的加载顺序,在你尝试再次正常运行之前你不会注意到它。所以它可能只是花费太多时间修复依赖关系。可能仍然可以追踪到足以构建一个长lua -l
foo
-l
{ {1}} bar
可能获得的一次性依赖列表要运行的东西,但不要依赖它。)
另一个选择是C(++)模块提供缺少的部分。如果这些是以Lua库的样式编写的(即它们有…
),它们可能会加载到解释器中。 (IIRC不太可能用于C ++,因为它希望主程序能够识别C ++,但是luaopen_FOO
(通常是?总是?)是纯粹的C.)这些模块也可能无法正常运行并且需要以其他方式加载。另一种可能性是主程序在它创建的Lua状态中预定义的东西,这意味着没有可以加载的模块来获取这些东西。
虽然上面有一些更多的变化,但这些应该是所有一般类别。如果你怀疑你的问题是第一个(只是缺少依赖信息),可能会多花一些时间,因为你很有可能让它工作。如果你怀疑它是后两者中的一个,那么很有可能你不能让它工作(至少不是直接)。
您可以通过修补程序打开REPL然后从那里做任何你想做的事情来解决这个问题。 (最简单的方法是调用lua
。它确实有限(没有多行,没有隐式debug.debug()
,糟糕的错误信息),但是如果你需要/想要更好的东西,那么表现得非常好的东西像普通的Lua REPL一样可以写成~30行左右的Lua。)