如何在交互终端上从c++/lua项目的lua文件中调用函数?
2017-2-17 8:56:35
收藏:0
阅读:76
评论:1
我在阅读一个由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]: ?
我该怎么办?
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

好的,可能发生了什么问题呢?
(根据您提供的信息,以下是一些普遍的猜测……)
一个可能是你缺少依赖项,因为文件没有正确地
require它们所依赖的所有内容。(如果A依赖并且requireB然后是C,C依赖B但不会指明要require它,因为它是由A隐式加载的,直接加载C将失败。)因此,如果你花费一些时间去跟踪和修复依赖项,事情可能会突然开始工作。(然而,这也许是不可能的,这取决于模块是如何编写的。例如,除非你在加载子模块之前设置
package.loaded["foo"]为_foo_的模块表,否则这些子模块将无法require"foo"。(幸运的是,module执行了这个操作,在没有module的新代码中,很容易忘记这个操作——然后你将陷入无尽循环中(直到堆栈溢出),foo加载其他模块,其他模块又加载_foo_,等等)此外,在“修复”它们以便在解释器中加载的过程中,你可能会无意间破坏程序/库在正常运行时使用的加载顺序,在你再次尝试正常运行它时才会注意到。因此,修复依赖项可能需要太多时间。你仍然可以追踪足够的依赖项来构建一个长的lua -lfoo-lbar_……一次性依赖项列表,这可能会让事情开始运行,但不要依赖它。)另一个可能性是C(++)模块缺少提供的部分。如果它们是按照Lua库的风格编写的(即它们有
luaopen_FOO),它们可能会在解释器中加载。(如果我没记错,对于C++来说这是不太可能的,因为它期望主程序是C++-aware的,但lua通常(始终?)是纯粹的C。)这些模块可能不是那样工作的,需要以其他方式加载。还有一种可能性,就是主程序在它创建的Lua状态中预定义了一些内容,这意味着没有模块可以加载以获取这些内容。虽然上述情况还有一些变化,但这些就是所有的一般分类。如果你认为自己的问题是第一个(仅仅是缺少依赖项信息),也许你应该再花一些时间去解决它,因为你有很大的机会使它工作。如果你认为是后两种情况之一,那么你很可能无法使它工作(至少不能直接)。
你可能可以通过修补程序来绕过这个问题,以打开一个REPL,然后从那里做你想做的事情。(最简单的方法是调用
debug.debug()。它功能有限(无多行,无隐式return,错误信息较差),但如果你需要/想要更好的东西,一个行为非常类似于正常Lua REPL的东西可以用 ~30行的Lua代码编写。)