问题标签 [luabind]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2606 浏览

c++ - 在 Windows 中构建 Luabind

我在使用 VS 2010 使 Lua 和 Luabind 在 Windows 7 下工作时遇到问题。到目前为止,我已经从http://luabinaries.sourceforge.net下载了 LuaBinaries,从http://www.hci.iastate.edu/下载了 Luabind ~rpavlik/doxygen/luabind/docs.html。我已经在命令行中相应地设置了我的环境变量 BOOST_ROOT 和 LUA_PATH,如 Luabind 的安装文件中所述,我无法克服这个错误:

如果有人能够在 Windows 下构建 Luabind,任何提示都非常感谢!更重要的是,如果有人能够使用 Lua 和 Luabind 建立一个 VS 2010 C++ 项目并愿意分享,我将不胜感激!

0 投票
1 回答
642 浏览

c++ - Luabind:派生类作为参数

我最近一直在学习 Luabind,打算集成到我们的软件中。我遇到了几个问题,我一直在查看 Luabind 的 Rasterbar Software 文档,但无法解决。基本上,我公开了一个将字符串和抽象基类作为参数的函数。首先,我不确定我是否以正确的方式进行此操作,或者在 lua 中可能需要一些特殊处理才能使其正常工作。无论如何,这是代码

BaseFactory 是一个抽象基类,它返回一个 UIComponent(按钮、文本等),我们派生了一个名为 TemplateFactory 的工厂,它基本上可以像这样实例化。

然后我们会像这样将这些传递给 c++ 中的 UIFactory ...

在卢宾德...

并在 lua...

最后一行没有执行,我检查了按钮工厂和 ui 工厂是否正在创建并且它们是。有什么我想念的吗?

非常感谢您的帮助。

0 投票
2 回答
609 浏览

c++ - 从 C++ 到 lua 的二维数组

那么,将多维数组从 C++ 传递到 Lua 真的可行吗?

或者我应该把它变成一个普通数组,将它传递给 Lua 并再次将它转换为 2d 数组?

如果可能的话,可以说我有这个

0 投票
1 回答
1350 浏览

c++ - luabind:无法从由非内置类索引的表中检索值

我正在使用 Ryan Pavlik 的主发行版中的 luabind 0.9.1 和 Lua 5.1、Win XP SP3 上的 cygwin + 最新补丁 x86、boost 1.48、gcc 4.3.4。Lua 和 boost 是 cygwin 预编译的版本。

我已经成功地在静态和共享版本中构建了 luabind。

两个版本都通过了所有测试,除了在两个版本中都失败的 test_object_identity.cpp 测试。

我已将问题追查到以下问题:如果表中的条目是为 NON 内置类(即不是 int、string 等)创建的,则无法检索该值。

这是一个演示这一点的代码片段:

tabc[1] 确实是 10 而 tabc[temp_object] 不是 30!(实际上,它似乎是零)

但是,如果我使用 iterate 遍历 tabc 条目,则有两个条目具有正确的键/值对。

有任何想法吗?

顺便说一句,像这样重载 == 运算符:

不改变结果。

我还尝试从 [] 运算符切换到 settable() 和 gettable()。结果是一样的。我可以通过调试器看到调用了密钥的默认转换,所以我猜错误来自其中的某个地方,但我无法弄清楚究竟是什么问题。

正如以下简单的测试用例所示,Luabind 对复杂类型的转换肯定存在错误:

希望比我聪明的人能解决这个问题,谢谢

我已经将问题追溯到这样一个事实,即 Luabind 每次使用复杂值作为键时都会创建一个 NEW DISTINCT 对象(但如果您使用原始值或对象则不会)。

这是一个小测试用例来证明这一点:

注意 tabc[tp] 首先是值 5,然后在通过 key 对象访问时被 7 覆盖。但是,当通过 tp 再次访问时,会创建一个新条目。这就是 gettable() 随后失败的原因。

谢谢,大卫

0 投票
1 回答
2646 浏览

c++ - 使用 luabind 和 std::shared_ptr 进行继承

我有一个依赖std::shared_ptr很多的 API(一个特定的 GUI 库),即它们通常用作函数参数并存储在其他对象中。例如,容器小部件(如拆分器和框)会将其子小部件存储在shared_ptrs 中。现在我想通过 luabind 将此 API 映射到 Lua。在理想情况下,Luabind 会在 shared_ptr 中创建新对象,并允许我将这些对象直接传递给采用 shared_ptr 参数的函数。这似乎适用于单个课程,例如:

虽然我这样声明它,但我可以公开和使用void foo(std::shared_ptr<Button> const&).

现在 luabind 手册提到,为了使用类的层次结构,我必须对层次结构中的所有类使用相同的 shared_ptr 模板实例,例如

现在我不能再调用foo了——它将无法从 Lua 中找到函数。我能以某种方式让 luabind 仍然支持在shared_ptrs 中传递按钮吗?另外,我想知道为什么 luabind 要求您对层次结构中的所有类使用相同的智能指针,而不是仅仅将它们转换为基类指针。

0 投票
1 回答
715 浏览

c++ - 如何链接到 Lua 中的回调函数,以便在重新加载脚本时更新回调?

我正在使用 LuaBind 在我的游戏中实现 Lua 脚本,我不清楚的一件事是在游戏中重新加载脚本的后勤工作。

目前,使用 LuaBind C++ 类luabind::object,我将对 Lua 回调的引用直接保存在使用它们的类中。然后我可以使用luabind::call_function该对象从 C++ 代码中调用 Lua 代码。

我还没有对此进行测试,但我的假设是,如果我重新加载脚本,那么所有函数都将被重新定义,但对旧函数的引用仍将以luabind::objectC++ 代码所持有的形式存在。我希望能够将旧的换成新的,而不必为游戏中的每个脚本挂钩手动管理它。

如何最好地改变这一点,使过程有效?

我的第一个想法是不要直接保存对函数的引用,而是可能保存函数名,并在每次我们想调用它时按名称获取函数。我正在寻找更好的想法!

0 投票
1 回答
5084 浏览

lua - LuaBind 和 package.loadlib

我正在尝试使用 luabind 在这里http://www.rasterbar.com/products/luabind/docs.html完成教程,但是我在加载库时遇到了问题。我目前使用的是 5.1 版的 lua,所以我相信我会使用 package.loadlib 而不是 loadlib。我做了一个简单的dll,它是这样的:

这构建得很好。但是,当我尝试运行此代码时,我在 lua 中遇到错误:

它声明 greet 是 nil。如何正确加载 dll 中的函数?

0 投票
1 回答
1378 浏览

c++ - 带有元数据的 Lua 回调

我想在 Lua 中为脚本编写者设置几个函数,但是当调用这些函数时,我希望它们实际调用一个带有我定义的参数的函数。这可能看起来像:

卢阿:

C++:

}

所以我对设置有点困惑。我正在尝试使用参数注册回调。这就是我到目前为止所拥有的,并且有些东西没有通过函数注册来保存参数;它似乎只保存我添加的最后一个参数。

当 lua 调用我的回调时,我总是看到 value[1],而不是 value[0]。我使用了注册回调然后添加表格的概念,但我不确定这会让我更进一步。

至于原因:我正在尝试抽象函数名称以使我们的 lua 程序员更容易编写代码,但这些只需要转换为相同的参数化函数。想想它通过传递一个参数来添加更改设置,但命名不同。

想法?

0 投票
1 回答
2935 浏览

c++ - 将 lua 表从 C++ 传递到 .Lua 脚本

我花了过去 6 个小时试图解决这个问题!我无法到达任何地方:s

我希望能够在 c++ 文件中创建一个 lua 表,然后将其传递给一个 lua 脚本文件,该文件具有以下 lua 函数:

我用两个字符串动态创建了一个一维数组:

所以现在我在堆栈顶部有桌子。我已经通过写这个来验证它: if( lua_istable(L,lua_gettop(L)))` 它返回 1,这意味着它是一个表。

然后我这样做了:

所以我得到了那个错误: 无法运行脚本:尝试调用表值

请注意,该文件还有我从 C++ 成功调用的其他几个函数。

有人可以帮我解决这个错误吗?这可能是LUA的错误吗?cz 我非常正确地遵循了这些步骤......我猜!

0 投票
1 回答
1119 浏览

c++ - lua+luabind,栈顶没有错误信息,在“运行时错误”之后

我正在尝试将 lua 嵌入到我的游戏引擎中。直到现在一切都很好。我开始注册与游戏引擎交互的函数(例如 move_object(id, x, y)),并且注册工作正常。接下来,我尝试像这样使用它:

这给了我一个来自 luabind 的“运行时错误”异常。我到处搜索,根据互联网(和 luabind 源),错误消息应该仍然在 lua 堆栈的顶部。我尝试捕获 luabind::error,并像这样打印堆栈的顶部:

像这样:

并且都打印这个:

我假设这只是我从处理程序表中调用更新函数时推送的最后一个值。这个值应该在遇到错误时被详细的错误字符串覆盖,对吗?根据luabind源文件“error.hpp”的定义class error

我相信我的 lua 代码的问题实际上在于我的 move_object 函数的注册(更新函数运行。我知道这一点,因为我之前取消了该 print 调用的注释),但如果没有更好的错误信息,我无法确定!哈哈

我修复了错误,如果它有任何帮助。我正在定义 move_object 函数,如下所示:

但显然,您不能使用 luabind 将静态成员函数定义为常规函数。我把它改成了这个(move_object在 C++ 中做了一个常规的全局函数):

我不知道这是否有助于解决原始问题,但我认为更多信息不会造成伤害!:)