如何将 Lua 粘合到 C++ 代码?

Posted

技术标签:

【中文标题】如何将 Lua 粘合到 C++ 代码?【英文标题】:How do you glue Lua to C++ code? 【发布时间】:2010-09-11 07:51:18 【问题描述】:

您使用 Luabind、toLua++ 或其他库(如果使用,是哪一个)或根本不使用?

每种方法的优缺点是什么?

【问题讨论】:

有人讨论过这个话题here。 【参考方案1】:

我真的不同意“自己动手”的投票,将基本类型和静态 C 函数绑定到 Lua 是微不足道的,是的,但是当您开始处理表和元表时,情况就发生了变化;事情很快变得棘手。

LuaBind 似乎可以完成这项工作,但我有一个哲学问题。对我来说,如果你的类型已经很复杂,那么 Luabind 被大量模板化的事实不会让你的代码更容易理解,正如我的一个朋友所说“你需要 Herb Shutter 来找出编译消息” .再加上它依赖于 Boost,加上编译时间会受到严重影响,等等。

在尝试了一些绑定之后,Tolua++ 似乎是最好的。 Tolua 似乎并没有在开发中,因为 Tolua++ 似乎工作正常(加上一半的“Tolua”教程实际上是“Tolua++”教程,相信我:) Tolua 确实生成了正确的东西,可以修改源代码,它似乎可以处理复杂的情况(如模板、联合、无名结构等)

Tolua++ 最大的问题似乎是缺乏适当的教程、预设的 Visual Studio 项目,或者命令行有点难以理解(你的路径/文件不能有空格 -in Windows 至少 - 等等)不过,对我来说,它是赢家。

【讨论】:

【参考方案2】:

部分回答我自己的问题:

Luabind:一旦您知道如何通过这种笨拙的模板语法来绑定方法和类,添加新绑定就非常简单明了。但是,luabind 具有显着的性能影响,不应该用于实时应用程序。比调用直接操作堆栈的 C 函数的开销大约高 5-20 倍。

【讨论】:

【参考方案3】:

我不使用任何库。前段时间我使用 SWIG 公开了一个 C 库,但是开销太大,我停止使用它。

优点是更好的性能和更多的控制,但它需要更多的时间来编写。

【讨论】:

【参考方案4】:

使用原始 Lua API 进行绑定——并保持简单。从 API 本身(AUX 库)和 Lua 作者的库中汲取灵感。

经过一些练习,原始 API 是最佳选择——最大的灵活性和最小的不必要开销。你已经得到了你想要的,没有更多,你需要它的方式。

如果您必须绑定大型第三方库,请使用自动生成器,如 tolua、tolua++(甚至针对特定情况使用您自己的生成器)。它会让你从体力劳动中解放出来。

我不推荐使用 Luabind。目前它的发展停滞不前(但开始恢复活力),如果你遇到一些极端情况,你可能会靠自己。 Luabind 也大量使用模板元编程。这可能(也可能不会)是不可接受的,具体取决于观点。

【讨论】:

除了那些可能使用不支持 TMP 的编译器的人之外,我不明白为什么它是不可接受的。至于开发,有一些(我最近贡献了一个增强/修复),而且大多数时候我不觉得它缺少任何太重要的东西。不过,它并不是非常活跃的。

以上是关于如何将 Lua 粘合到 C++ 代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Lua FFI 与 C++ 函数一起使用

如何在cocos2d c++代码中调用lua以及探究

如何在cocos2d c++代码中调用lua以及探究

从 C++ 将字节数组传递给 lua 脚本方法

如何在 C++ 中创建 Lua 表,并将其传递给 Lua 函数?

如何从 C++ 读取和写入嵌套的 lua 表?