如何将 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++ 代码?的主要内容,如果未能解决你的问题,请参考以下文章