【问题标题】:Extending a C++ application with embedded scripting使用嵌入式脚本扩展 C++ 应用程序
【发布时间】:2012-02-10 23:09:57
【问题描述】:

我正在开发一个需要与多平台兼容 (Windows/Linux) 的 C++ 应用程序,并希望授予用户扩展软件以完全满足他们的需求的能力,而不允许他们更改应用程序的关键部分(所以我不希望它们出现在 C++ 代码中)。

我正在寻找的是嵌入一种脚本语言(我更喜欢 Python,因为我已经熟悉它,但这不是强制性的),所以如果我想要这些,放在一些插件文件夹中的脚本可以操纵应用程序的对象可修改的对象。

最简单的例子:如果有人想为我的应用程序构建自己的 UI,他们应该可以使用这样的脚本来实现。

但问题是,我从未将 C++ 和任何类型的外部脚本放在一起,所以我真的不知道如何开始。在寻找入门材料后,我发现Lua 声称是一种很好的语言,但我找不到好的初学者教程。

如果有人知道一个好的起点,无论是在线资源还是一本好书,我将不胜感激。我不介意花几块钱买一本好书。

作为一名学习者,我倾向于通过混合示例代码和几行解释这些代码来获得最好的学习效果。

【问题讨论】:

标签: c++ python scripting lua


【解决方案1】:

我建议你阅读Programming in Lua,这本书有一整节介绍如何在 C(和 C++)中嵌入 Lua。

Amazon users评价很高。

该语言也有相当不错的online documentation 和活跃的mailing list

【讨论】:

  • 从我目前所看到的来看,这本书推荐看起来最有希望。我一定会读一读。谢谢。
【解决方案2】:

如果你想使用 Python,我肯定会建议使用 Boost.Python。这是一个设计精良的图书馆。举个例子:向 Python 公开一个 C++ 类所需要做的就是:

struct World
{
    void set(std::string msg) { this->msg = msg; }
    std::string greet() { return msg; }
    std::string msg;
};

BOOST_PYTHON_MODULE(hello)
{
    class_<World>("World")
        .def("greet", &World::greet)
        .def("set", &World::set)
    ;
}

它几乎可以自动处理所有事情:类型之间的转换、异常,它甚至允许您通过boost::shared_ptr 在两种语言之间使用引用计数对象。

【讨论】:

  • 这听起来不错,而且 Boost 文档看起来也写得很好。今晚晚些时候我会更深入地研究它。谢谢。
  • 如果您在 Windows 上使用 Visual Studio,安装库会容易得多,只需使用 BoostPro 的安装程序:boostpro.com/download
  • 很遗憾,我正在使用 gcc 4.4.5 在 Debian 中开发这个项目,但感谢您的提示。
  • 大家知道,有一个类似的 Lua 库,叫做 luabind。它受到 boost.python 的启发,使用 luabind 将类绑定到 Lua 的代码看起来与使用 boost.python 的 Python 代码几乎相同
【解决方案3】:

文章here at linux journal 是一个很好的起点,可以帮助您了解如何在您的 c/c++ 代码中嵌入 Python 解释器。然而,这只是成功的一半,因为当解释器被嵌入时,您需要将软件的某些部分发布到脚本环境。这样做的基本 API 是在 C 中,如果您的大部分代码是 C++,最好使用 boost::python,因为围绕 C++ 类编写 C 包装器可能很麻烦。您还可以使用 Py++ 生成 boost::python 绑定。

如果您只想将脚本用作自定义的门,并且可以忍受 python 的内存占用,那么它可能是比 Lua 更好的选择。 Lua 通常适用于游戏开发等小型环境。 python 开发人员也比 lua 开发人员多得多,并且可用的内置插件和第三方库也更多。

【讨论】:

    【解决方案4】:

    对于 Python,我猜 boost 库就是为了做到这一点。至于 Lua,我自己没有用过,但是通过 Google 快速搜索,我首先找到了debian admin,然后找到了Lua's C interface。你看过那些吗?

    【讨论】:

    • 对于 Lua,有 Luabind,它起源于 Boost Python,工作原理非常相似(而且效果很好)。
    • 非常感谢!我以前没有使用过 Lua,我对如何开始很感兴趣。
    猜你喜欢
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 2011-02-27
    • 2021-12-17
    • 1970-01-01
    • 2011-03-28
    相关资源
    最近更新 更多