现在的位置: 首页 > 综合 > 正文

Shiboken学习小结

2013年05月22日 ⁄ 综合 ⁄ 共 1789字 ⁄ 字号 评论关闭

从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()返回的路径

参考

 

抱歉!评论已关闭.