如何在交互式终端上调用c ++ / lua项目的lua文件中的函数?

时间:2017-02-17 08:56:35

标签: lua

我正在阅读项目的一些源代码,这是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]: ?

我该怎么办?

1 个答案:

答案 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。)