生成.defs文件
.defs是一种使用lisp格式的文本文件,它描述了C库的API,其中包括了以下内容:
- 对象(GObjects、部件、接口、装箱类型、普通结构体)
- 函数
- 枚举
- 信号
- 属性
- 虚函数(vfuncs)
目前我们有一些单独的工具用于生成.defs文件的一部分,因此我们将它们拆分为单独的文件,例如在gtkmm源的gtk/src目录中你将看到以下文件:
- gtk.defs
包含其他文件。
- gtk_methods.defs
对象和函数。
- gtk_enums.defs
枚举。
- gtk_signals.defs
信号和属性。
- gtk_vfuncs.defs
虚函数(结构体中的函数指针字段),手动编写。
skeletonmm/tools/generate_defs_and_docs.sh将生成所有的这些.defs以及*_docs.xml文件,如该小节的文档所述。
- G.2.1. 生成_methods.defs文件
- G.2.2. 生成_enums.defs文件
- G.2.3. 生成_signals.defs文件
- G.2.4. 编写_vfunc.defs文件
G.2.1. 生成_methods.defs文件
这个.defs文件描述了对象及其函数。它是由h2def.py脚本生成的,你可以在glibmm的tools/defs_gen文件夹中找到该脚本。例如:
$ ./h2def.py /usr/include/gtk-4.0/gtk/*.h > gtk_methods.defs
G.2.2. 生成_enums.defs文件
这个.defs文件描述了枚举类型及其可能的值。它是由enum.pl脚本生成的,你可以在glibmm的tools文件夹中找到该脚本。例如:
$ ./enum.pl /usr/include/gtk-4.0/gtk/*.h > gtk_enums.defs
G.2.3. 生成_signals.defs文件
这个.defs文件描述了信号和属性。它是由封装项目自有的generate_extra_defs实用程序生成的,你可以在类似于gtkmm/tools/extra_defs_gen/的目录下找到它。例如:
$ cd tools/extra_defs_gen $ ./generate_extra_defs > gtk_signals.defs
你必须编辑自己的generate_extra_defs工具的源代码才能为需要封装的GObject C类型生成.defs文件。在skeleton源代码树中,源文件名为tools/extra_defs_gen/generate_defs_skeleton.cc。你需要将文件重命名为正确的文件名(按前一小节所述),然后在tools/extra_defs_gen/meson.build文件中提到新的源文件名。
然后编辑.cc以指定正确的类型。例如,你的main()函数可能如下所示:
#include <glibmm_generate_extra_defs/generate_extra_defs.h> #include <libsomething.h> #include <iostream> int main(int, char**) { something_init(); std::cout << get_defs(SOME_TYPE_WIDGET) << get_defs(SOME_TYPE_STUFF); return 0; }