# gobj_build **Repository Path**: Mikelucis/gobj_build ## Basic Information - **Project Name**: gobj_build - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-02-05 - **Last Updated**: 2025-02-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## GObject 实例 本程序开发环境使用VSC + Clangd搭建,运行环境为CMake + pkgConfig-1.8.1 + glib-2.83.3 > GObject教程参考:https://blog.csdn.net/knowledgebao/article/details/84633798 > 本项目CMake项目架构参考:https://zhuanlan.zhihu.com/p/631257434 ### GObject常见宏 > 注:P指Project,常使用首字母缩写;T指Type,即宏定义所属类型;I为Interface的缩写 #### 类常见宏 ``` c // 向 GObject 库的类型系统注册 PT 类 #define P_TYPE_T (p_t_get_type ()) // 将 obj 对象的类型强制转换为 P_T 类的实例结构体类型 #define P_T(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), P_TYPE_T, PT)) // 判断 obj 对象的类型是否为 P_T 类的实例结构体类型 #define P_IS_T(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), P_TYPE_T) // 将 klass 类结构体的类型强制转换为 P_T 类的类结构体类型 #define P_T_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), P_TYPE_T, PTClass)) // 判断 klass 类结构体的类型是否为 P_T 类的类结构体类型 #define P_IS_T_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), P_TYPE_T)) // 获取 obj 对象对应的类结构体类型 #define P_T_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), P_TYPE_T, PTClass)) // 获取obj对象对应的私有数据 #define P_T_GET_PRIVATE(obj) G_TYPE_INSTANCE_GET_PRIVATE ((obj), P_TYPE_T, PTPrivate) ``` #### 接口常见宏 ``` c // 向 GObject 库的类型系统注册 PIT 接口 #define P_TYPE_IT (p_t_get_type ()) // 将 obj 对象的类型强制转换为 P_IT 接口的实例结构体类型 #define P_IT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), P_TYPE_IT, PIt)) // 将 obj 对象的类型强制转换为 P_IT 接口的实例结构体类型 #define P_IS_IT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), P_TYPE_IT)) // 获取 obj 对象对应的 P_IT 接口的类结构体类型 #define P_IT_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), P_TYPE_IT, PItInterface)) ``` ### 要点提炼 A. 使用 GObject 库模拟类的数据封装形式 1. 在 .h 文件中包含 glib-object.h; 2. 在 .h 文件中构建实例结构体与类结构体,并分别将 GObject 类的实例结构体与类结构体置于成员之首 (继承GObject); 3. 在 .h 文件中定义 P_TYPE_T 宏,并声明 p_t_get_type 函数; 4. 在 .c 文件中调用 G_DEFINE_TYPE 宏产生类型注册代码。 B. GObject 子类对象的私有属性模拟 1. 从h文件实例结构体中移除要隐藏的成员,并在c文件中创建隐藏成员结构体 2. 在类结构体初始化函数中使用g_type_class_add_private方法将隐藏成员结构体添加到实例结构体中 3. 在其他地方使用G_TYPE_INSTANCE_GET_PRIVATE宏获取隐藏成员结构体从而获取对应属性 C. GObject 子类私有属性的外部访问 1. 定义成员属性枚举,每一个成员变量对应一个枚举类型 2. 定义Get/Set Property函数,即gb_dlist_get/set_property函数 3. 在class_init中,将get/set函数注册到父类GObject中 4. 在class_init中,使用g_object_class_install_property函数将每个属性添加到基类的属性列表中 D. GObject 的子类继承 1. 在头文件内, 子类的实例结构体与类结构体需分别包含父类的的实例结构体与类结构体 2. 在源文件内, G_DEFINE_TYPE的parent_type定义为基类的xxx_get_type()方法(即XX_TYPE_XXX宏) E. GObject 对接口的模拟 一. 声明接口 1. 头文件中,定义接口类结构体PITInterface与[相关宏](#类常见宏) 2. 在接口结构体内定义接口函数指针 (type (*xxx)(type param)),并在结构体外声明接口 3. 源文件中,注册G_DEFINE_INTERFACE宏,实现P_T_default_init(PITInterface *)方法 4. 实现头文件中声明的接口方法 二. 实现接口 1. 头文件中与继承GObject一致 2. 源文件中,定义P_T_interface_init方法,并使用G_DEFINE_TYPE_WITH_CODE代替G_DEFINE_TYPE 3. 在P_T_interface_init中注册实现类接口方法 --- ``` 注意:程序运行前需要手动设置库路径 export LD_LIBRARY_PATH=/home/mikelucis/Program/TARGET/lib/x86_64-linux-gnu ```