用嵌入脚本扩展C++应用程序

2 投票
4 回答
1585 浏览
提问于 2025-04-17 10:18

我正在开发一个C++应用程序,希望它能在多个平台上运行(比如Windows和Linux),同时想让用户能够根据自己的需求扩展软件,但又不想让他们修改应用程序的关键部分(也就是不想让他们直接接触C++代码)。

我想要的是嵌入一种脚本语言(我比较喜欢Python,因为我已经熟悉它,但这不是必须的),这样用户可以把脚本放在某个插件文件夹里,来操作应用程序中的对象,如果我希望这些对象是可以被修改的。

举个简单的例子:如果有人想为我的应用程序创建自己的用户界面,他们应该能够通过这样的脚本来实现。

不过问题是,我从来没有把C++和任何外部脚本结合在一起过,所以我真的不知道该从哪里开始。在寻找入门资料时,我发现Lua声称是一个不错的选择,但我找不到好的初学者教程。

如果有人知道一个好的入门地方,无论是在线资源还是一本好书,我都会非常感激。我不介意花一些钱买一本好书。

作为一个学习者,我发现我最喜欢的是通过一些示例代码和几行解释来学习。

4 个回答

1

这篇文章在Linux Journal上,是关于如何在你的C/C++代码中嵌入Python解释器的一个不错的起点。不过,这只是解决问题的一半,因为当你嵌入了解释器后,你还需要将你软件的一部分发布到脚本环境中。要做到这一点的基本接口是用C语言写的,如果你大部分代码是C++,那么使用boost::python可能更好,因为为你的C++类写C语言的包装代码可能会很麻烦。你也可以使用Py++来生成boost::python的绑定。

如果你只是想用脚本来进行一些定制,并且能接受Python的内存占用,那么选择Python可能比Lua更好。Lua通常适合像游戏开发这样的小环境。而且,Python开发者的数量远远超过Lua开发者,Python还有更多的内置功能和第三方库可供使用。

3

如果你想用Python,我强烈推荐使用Boost.Python这个库。这个库设计得非常好。举个例子:你只需要做这些,就可以把一个C++类暴露给Python使用:

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

6

我建议你看看《Lua编程》这本书,这里面有专门一章讲怎么把Lua嵌入到C(和C++)里。

这本书在亚马逊用户中评价非常高。

这个语言还有很不错的在线文档和一个活跃的邮件列表

撰写回答