以前学习的过程中,使用的 GlibGtk4 都是使用 C语言 版本。这些库也支持其他语言编写,Python、JavaScript、Vala等。

比如Python运行GTK4,通过 PyGObject提供的gi 获取 Gtk-4.0.typelib,最终链接到 libgtk-4.so

1 GObject Introspection Repository

GObject Introspection Repository (GIR) 是 GNOME 开发中的一个重要工具,用于描述和提供 GObject 类型系统的信息。这些信息包括类、对象、方法、属性等的结构和特性,以及它们在底层 C 语言中的实现细节。

GIR 的主要作用是为各种编程语言(如Python、JavaScript、Vala等)生成绑定(bindings),使得这些语言可以与 GNOME 库进行交互和使用。它通过解析 GObject 类型系统的头文件,并生成对应的元数据描述文件(.gir 文件),从而使得开发者可以在其他语言中直接调用和使用 GNOME 库的功能,而无需手动编写对应的绑定代码。

通过 GObject Introspection,开发者可以更方便地利用 GNOME 开发的丰富功能和工具来构建应用程序,同时也促进了跨语言开发和互操作性。

GObject Introspection 提供以下工具:

  • g-ir-scanner:通过解析头文件、包含注释的 GTK-Doc 注释块和 GObject 库,生成 GIR XML 文件的工具。(通过扫描头文件,生成包含类、方法、属性、信号等详细信息XML格式的.gir文件)

  • g-ir-compiler:一个 typelib 编译器。它将一个或多个 GIR 文件转换为一个或多个 typelib blob。(编译 .gir 文件生成二进制 .typelib文件)

  • g-ir-generate:使用存储库 API 生成 GIR 文件的工具。它从共享对象或原始 typelib blob 中的二进制 typelib 生成 GIR 文件。(从二进制文件 .typelib 生成 .gir 文件)

  • g-ir-annotation-tool:从源代码文件中提取注释。 g-ir-doc-tool:从 GIR XML 文件生成 API 参考文档。

    alt text

1.1 g-ir-scanner

libadwaita 为例,通过 g-ir-scanner 命令生成了 XML 格式的 Adw-1.gir 文件。

alt text

通过查看 Adw-1.gir 文件,我们可以看到,关于命名空间、版本、需要链接的动态库一些信息。

alt text

gir文件路径

gir搜索路径的相关环境变量是:XDG_DATA_DIRS,查看该环境变量可以发现:

alt text

实际文件搜索路径应该是: /usr/share/gir-1.0,在环境变量赋值的时候会省略 gir-1.0

我们打开 /usr/share/gir-1.0,发现刚才安装的 Adw-1.gir 文件。

alt text

如果我们安装的 `.gir` 文件不在默认环境变量搜索路径,可以自行添加搜索路径。

一般只在其他软件编译的时候,可能要搜索相关的 .gir 文件。

1.2 g-ir-compiler

libadwaita 为例,通过 g-ir-compiler 命令生成了二进制 Adw-1.typelib 文件。该二进制文件会在其他高级编程语言,比如python、JavaScript、Vala中使用。(比如python,其实准确来说是通过gi,加载该二进制文件,最后调用相关动态库)

alt text

alt text

  1. 该文件一般是被安装到 /usr/lib/x86_64-linux-gnu/girepository-1.0/alt text

  2. 可以通过环境变量指定 GI_TYPELIB_PATH,指定*.typelib文件搜索路径。

    alt text

1.3 g-ir-generate

这个命令是把二进制 *.typelib 文件,转换成 XML 格式的 *.gir 文件。我们以 WebKit2-4.1.typelib 为例。

编译 cambalache 的时候,会提示 gi.repository.WebKit2 没有找到。

alt text

我们通过 apt download gir1.2-webkit2-4.1 下载后发现,里面只有一个 WebKit2-4.1.typelib 二进制文件,并没有相关库,我们可以通过命令 g-ir-generate 查看具体依赖那些库。

alt text

alt text

发现需要的是 libwebkit2gtk-4.1.so.0libjavascriptcoregtk-4.1.so.0 库文件。

alt text

1.4 构建文件使能introspection

比如 Gtk4adwaita,只有在编译选项里面使能 introspection,就会编译生成相关的 .gir.typelib 文件。

alt text

alt text

2 PyGObject

PyGObject 是一个 Python 包,它基于 GObject 的库提供绑定,这些库包括 GTK、GStreamer、WebKitGTK、GLib、GIO 等。

它支持 Linux、Windows 和 macOS,适用于 Python 3.9+ 和 PyPy3。PyGObject(包括此文档)是根据 LGPLv2.1+ 许可证发布的。

alt text

可以通过 gi 导入 Adw-1.typelib ,进而引用 libadwaita库.

2.1 PyGObject下载链接

  1. apt下载
     sudo apt install -y python3-gi
    
  2. 源码编译下载:https://gitlab.gnome.org/GNOME/pygobject/-/tags

2.3 PyGObject会安装那些文件

可以看到 /usr/lib/python3/dist-packages 下面会有 gi 相关组件。

alt text

3 Python运行Adw

前面了解了 GIR,接下来分析一下,如何使用Python运行 Adw(Adw是基于Gtk4的一个界面库)。

# 新建一个空白窗口
import gi
gi.require_version('Adw', '1')
from gi.repository import Adw

def on_activate(app):
    win = Adw.ApplicationWindow(application=app)
    win.present()

app = Adw.Application()
app.connect('activate', on_activate)

app.run(None)
  1. Adw-1.typelib 就是 gi.require_version('Adw', '1'),搜索路径是在 /usr/lib/x86_64-linux-gnu/girepository-1.0/,如果将 Adw-1.typelib 改成 Adw-2.typelib,就无法找到。(没有通过其他注册信息去搜索,严格验证名字去找对应的typelib)

    alt text

  2. 通过 Adw-1.typelib 文件链接到 libadwaita-1.so.0 库。(如果我们删除系统里面的该库,python程序也会无法运行,本质上还是调用二进制共享库)

    alt text

  3. 如果不在系统路径 /usr/lib/x86_64-linux-gnu/girepository-1.0/,可以使用环境变量 GI_TYPELIB_PATH,指定*.typelib文件搜索路径。

    alt text

待总结

C++使用GTK

https://www.gtk.org/docs/language-bindings/cpp

C++使用GObject

https://thinkingeek.com/2023/01/15/wrapping-gobjects-in-cpp/

https://thinkingeek.com/2023/02/04/writing-gobjects-in-cpp/