使用嵌入式脚本扩展C++应用程序
Extending a C++ application with embedded scripting
我正在开发一个C++应用程序,该应用程序需要与多平台兼容(Windows/Linux),并希望允许用户扩展软件以完全满足他们的需求,而不允许他们更改应用程序的关键部分(所以我不希望它们出现在C++代码中)。
我想要的是嵌入一种脚本语言(我更喜欢Python,因为我已经熟悉它了,但它不是强制性的),所以如果我想修改应用程序的对象,放在某个插件文件夹中的脚本可以操作这些对象。
最简单的例子是:如果有人想为我的应用程序构建自己的UI,他们应该能够使用这样的脚本来实现。
然而,问题是,我从来没有把C++和任何类型的外部脚本放在一起,所以我真的不知道如何开始。在寻找了入门材料后,我发现Lua声称自己是一种很好的语言,但我找不到好的初学者教程。
如果有人知道一个好的起点,无论是在线资源还是一本好书,我都会非常感激。我不介意花几块钱买一本好书
作为一名学习者,我倾向于从示例代码和几行解释代码中学习到最好的东西。
我建议你阅读Lua中的编程,这本书有一整节关于如何将Lua嵌入到C(和C++)中。
亚马逊用户对它的评价非常高。
该语言也有相当好的在线文档和一个活跃的邮件列表。
如果你想使用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
在两种语言之间使用引用计数的对象。
linux期刊上的这篇文章是一个很好的起点,可以了解如何在c/c++代码中嵌入python解释器。然而,这只是战斗的一半,因为当解释器被嵌入时,您需要将软件的某些部分发布到脚本环境中。实现这一点的基本API是用C编写的,如果大多数代码都是C++,那么最好使用boost::python,因为围绕C++类编写C包装器可能很麻烦。您还可以使用Py++生成boost::python绑定。
如果你只想把脚本作为一扇定制之门,并且你可以忍受python的内存占用,那么它可能是比Lua更好的选择。Lua通常适合小环境,比如游戏开发。还有比lua开发人员多得多的python开发人员,以及更多的内置库和第三方库。
对于Python,我想boost库就是用来做这件事的。至于Lua,我自己还没有用过,但在谷歌上快速搜索后,我首先找到了debian admin,然后找到了Lua的C接口。你查过了吗?
- 试图在visual studio上用C++创建一个桌面应用程序
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 在C应用程序中运行C++(带有STL)函数
- 使用VerQueryValue检索应用程序的文件描述
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用调试/崩溃报告将应用程序部署到客户端
- C++控制台应用程序阻止退出
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 将应用程序从32位移植到64位时出现问题
- 如何改变c++应用程序的视觉效果
- WM_CTLCOLORSTATIC从未在WIN32应用程序中触发
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 示例外壳应用程序显示的 V8 "segmentation fault (core dumped)"错误
- phytec phyBOARD iMX-6在从闪存而不是SD卡运行qt5 opengles应用程序时表现不佳(FPS减半
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 如何从Windows应用程序输出到标准?
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- 如何在 64 位 vb.net Windows 应用程序中引用 32 位 dll
- 如果整个应用程序是虚拟映射的,为什么 new 会进行系统调用?