用嵌入脚本扩展C++应用程序
我正在开发一个C++应用程序,希望它能在多个平台上运行(比如Windows和Linux),同时想让用户能够根据自己的需求扩展软件,但又不想让他们修改应用程序的关键部分(也就是不想让他们直接接触C++代码)。
我想要的是嵌入一种脚本语言(我比较喜欢Python,因为我已经熟悉它,但这不是必须的),这样用户可以把脚本放在某个插件文件夹里,来操作应用程序中的对象,如果我希望这些对象是可以被修改的。
举个简单的例子:如果有人想为我的应用程序创建自己的用户界面,他们应该能够通过这样的脚本来实现。
不过问题是,我从来没有把C++和任何外部脚本结合在一起过,所以我真的不知道该从哪里开始。在寻找入门资料时,我发现Lua声称是一个不错的选择,但我找不到好的初学者教程。
如果有人知道一个好的入门地方,无论是在线资源还是一本好书,我都会非常感激。我不介意花一些钱买一本好书。
作为一个学习者,我发现我最喜欢的是通过一些示例代码和几行解释来学习。
4 个回答
这篇文章在Linux Journal上,是关于如何在你的C/C++代码中嵌入Python解释器的一个不错的起点。不过,这只是解决问题的一半,因为当你嵌入了解释器后,你还需要将你软件的一部分发布到脚本环境中。要做到这一点的基本接口是用C语言写的,如果你大部分代码是C++,那么使用boost::python可能更好,因为为你的C++类写C语言的包装代码可能会很麻烦。你也可以使用Py++来生成boost::python的绑定。
如果你只是想用脚本来进行一些定制,并且能接受Python的内存占用,那么选择Python可能比Lua更好。Lua通常适合像游戏开发这样的小环境。而且,Python开发者的数量远远超过Lua开发者,Python还有更多的内置功能和第三方库可供使用。
如果你想用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
。