从PySide一换成shiboken就开始关注它,可是由于对python的C调用不熟,对cmake构建系统不熟,从尝试了解shiboken到现在已经10个月过去了,还是一直没什么进展。但必须学习并整理一下了:
什么是Shiboken
Setanta 解释说:Shiboken是一个为C/C++库生成CPython绑定代码的生成器,除此之外,没有任何附加的含义。 原文如下:
- Before going on with this, allow me to explain that Shiboken means absolutely nothing. Not buddhist void, I just mean that the word Shiboken has no meaning attached to it. Except, of course, “generator of CPython based binding code for C/C++ libraries”.
文档的第一行是这么告诉的我们:Shiboken 是 Generator Runner 的一个插件(前端),它使用CPython代码为C++库生成绑定。 原文如下:
- Shiboken is a plugin (front-end) for Generator Runner. It generates bindings for C++ libraries using CPython source code.
为了了解Shiboken,我们需要先看看 Generator Runner:
Generator Runner
- GeneratorRunner 是为了便于为C++和Qt的库开发语言绑定而创建的一个工具。
- 它提供了一个框架来使得这个过程能够最大可能地自动化:
- 使用ApiExtractor提来提取C++头文件中的信息
- 通过相应的前端(用户可以自己提供)来生成某种目标语言的绑定
要想为生成C++库生成绑定,我们需要
从C++库的头文件中提取信息 | ApiExtractor |
控制提取(修改、重命名)哪些信息 | 通过 typesystem 文件 |
信息提取之后,我们理论上可以为各种高层的语言提供绑定(只要有相应的前端存在)。
为CPython生成绑定 | shiboken |
为要绑定的库生成文档 | DocGenerator |
为... 生成绑定 | ... |
Generator Runner 本身比较简单,它的工作都是通过ApiExtractor和前端(比如此处的Shiboken) 来完成的。
-
Generator Runner 定义了一个前端的接口类 class Generator;
-
每个前端插件(比如Shiboken)只需要提供了一个函数void getGenerators(GeneratorList* list) 来返回包含Generator的一个链表(QLinkedList)
- 在调用 Generator Runner 时,通过命令行指定使用哪一个前端
generatorrunner --generator-set=shiboken
再看Shiboken
当编译或安装Shiboken时,我们会注意到和shiboken名字相关的有3个文件:
shiboken_generator(.dll/.so/...) | 这个就是前面一直在提的插件(前端) |
shiboken-python*(.dll/.so/...) | 最终生成的代码需要依赖这个来运行 |
shiboken(.exe) | 这只是一个外壳,就是generatorrunner --generator-set=shiboken |
插件位置 :
- 在命令行的 --generator-set 中我们可以指定插件的全路径。
- 如果不是全路径(比如指定shiboken),generatorrunner 先合成文件名(shiboken_generator.dll),再去以下路径搜索
- 编译时指定的插件目录
- QCoreApplication::libraryPaths()返回的路径
参考