glib常用接口使用
- 1. glib介绍
- 2. glib命令安装
- 3. 获取glib的版本信息和兼容信息
- 4. glib使用例子
- 4.1 链表例子
- 4.2 哈希表例子
- 4.3 使用面向对象例子
1. glib介绍
广泛应用于桌面环境、嵌入式系统、GNOME等项目中。它提供了完整的面向对象编程模型(GObject)、信号/槽机制、内存管理等高级功能。
优点:
- 提供了完整的面向对象支持(如继承、封装、多态)。
- 包含了信号/槽机制,适合事件驱动编程。
- 支持跨平台和嵌入式系统,具有较好的可移植性。
- 性能较好,适合资源受限的嵌入式系统(尤其是在高端嵌入式设备中)。
2. glib命令安装
下面介绍该组件的安装命令和安装路径查询
sudo apt update
sudo apt install libglib2.0-dev
#使用命令验证是否安装成功
pkg-config --modversion glib-2.0
#通过命令确认库的安装路径
pkg-config --variable=libdir glib-2.0
#头文件的安装路径
pkg-config --variable=includedir glib-2.0
#获取程序编译传参参数命令
pkg-config --cflags --libs glib-2.0
3. 获取glib的版本信息和兼容信息
int main() {gchar *str = NULL;gboolean ret = FALSE;g_print("glib_major_version:%d\n", glib_major_version);g_print("glib_minor_version:%d\n", glib_minor_version);g_print("glib_micro_version:%d\n", glib_micro_version);g_print("GLIB_MAJOR_VERSION:%d\n", GLIB_MAJOR_VERSION);g_print("GLIB_MINOR_VERSION:%d\n", GLIB_MINOR_VERSION);g_print("GLIB_MICRO_VERSION:%d\n", GLIB_MICRO_VERSION);str = (gchar *)glib_check_version(2, 70, 1);if(NULL != str) {g_print("str:%s \n", str);} else {g_print("GLib library is compatible with your given version(2.70.1) \n");}return 0;
}
4. glib使用例子
下面介绍使用的常用例子
4.1 链表例子
#include <glib.h>
#include <stdio.h>
int main() {// 创建一个空链表GList *list = NULL;// 向链表中添加元素list = g_list_append(list, "Hello");list = g_list_append(list, "World");list = g_list_append(list, "GLib");// 遍历并打印链表中的元素for (GList *l = list; l != NULL; l = l->next) {printf("%s\n", (char *)l->data);}// 释放链表g_list_free(list);return 0;
}
Makefile编译文件如下:
all:gcc -o my_program main.c -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lglib-2.0 -lgobject-2.0
4.2 哈希表例子
g_hash_table_new
函数原型
GHashTable* g_hash_table_new(GHashFunc hash_func,GEqualFunc key_equal_func);
哈希函数:
g_str_hash
:用于字符串的哈希函数。g_int_hash
:用于整数的哈希函数。
比较函数:
g_str_equal
:用于比较两个字符串是否相等。g_int_equal
:用于比较两个整数是否相等。
完整的例子:
#include <glib.h>
#include <stdio.h>
int main() {// 创建一个哈希表,键为字符串,值为整数GHashTable *hash_table = g_hash_table_new(g_str_hash, g_str_equal);// 插入键值对g_hash_table_insert(hash_table, "key1", GINT_TO_POINTER(1));g_hash_table_insert(hash_table, "key2", GINT_TO_POINTER(2));// 查找并打印值printf("key1: %d\n", GPOINTER_TO_INT(g_hash_table_lookup(hash_table, "key1")));printf("key2: %d\n", GPOINTER_TO_INT(g_hash_table_lookup(hash_table, "key2")));// 释放哈希表g_hash_table_destroy(hash_table);return 0;
}
4.3 使用面向对象例子
基础的例子:
#include <glib.h>
#include <glib-object.h>
// 定义一个结构体,表示一个对象
typedef struct _MyObject MyObject;
typedef struct _MyObjectClass MyObjectClass;
struct _MyObject {GObject parent_instance; // 必须继承自GObjectgint value; // 类的成员变量
};
struct _MyObjectClass {GObjectClass parent_class; // 必须继承自GObjectClassvoid (*print_value)(MyObject *self); // 一个方法
};
// 类型定义宏
G_DEFINE_TYPE(MyObject, my_object, G_TYPE_OBJECT);// 构造函数
static void my_object_init(MyObject *self) {self->value = 0; // 初始化成员变量
}
// 析构函数
static void my_object_finalize(GObject *object) {// 清理操作G_OBJECT_CLASS(my_object_parent_class)->finalize(object);
}
// 定义print_value方法
static void my_object_print_value(MyObject *self) {g_print("Value: %d\n", self->value);
}
// 类型初始化
static void my_object_class_init(MyObjectClass *klass) {GObjectClass *object_class = G_OBJECT_CLASS(klass);object_class->finalize = my_object_finalize;klass->print_value = my_object_print_value; // 注册方法
}
// 主程序
int main(int argc, char *argv[]) {// 创建MyObject对象MyObject *obj = g_object_new(my_object_get_type(), NULL);// 设置值obj->value = 86;MyObjectClass *klass = G_TYPE_INSTANCE_GET_CLASS(obj, MY_TYPE_OBJECT, MyObjectClass);klass->print_value(obj);// 销毁对象g_object_unref(obj);return 0;
}
高级一点的例子:
#include <glib-object.h>
#include <stdio.h>#define TYPE_PRODUCT (product_get_type())
G_DECLARE_DERIVABLE_TYPE(Product, product, PRODUCT, BASE, GObject)
struct _ProductClass {GObjectClass parent_class;/* 抽象方法 */const gchar* (*get_details)(Product *self);gdouble (*get_price)(Product *self);
};/* Product 默认实现 */
static const gchar* product_get_details(Product *self) {return "Abstract Product";
}static gdouble product_get_price(Product *self) {return 0.0;
}G_DEFINE_TYPE(Product, product, G_TYPE_OBJECT)static void product_class_init(ProductClass *klass) {klass->get_details = product_get_details;klass->get_price = product_get_price;
}static void product_init(Product *self) {/* 初始化成员 */
}/* -------------------------实体类: PhysicalProduct
------------------------- */
#define TYPE_PHYSICAL_PRODUCT (physical_product_get_type())
G_DECLARE_FINAL_TYPE(PhysicalProduct, physical_product, PHYSICAL_PRODUCT, BASE, Product)struct _PhysicalProduct {Product parent_instance;gchar *name;gdouble price;gdouble weight;
};
G_DEFINE_TYPE(PhysicalProduct, physical_product, TYPE_PRODUCT)static const gchar* physical_product_get_details(Product *self) {PhysicalProduct *product = (PhysicalProduct*)self;return g_strdup_printf("Physical Product: %s, Price: %.2f, Weight: %.2fkg",product->name, product->price, product->weight);
}static gdouble physical_product_get_price(Product *self) {PhysicalProduct *product = (PhysicalProduct*)self;return product->price;
}static void physical_product_finalize(GObject *object) {PhysicalProduct *self = (PhysicalProduct*)object;g_free(self->name);G_OBJECT_CLASS(physical_product_parent_class)->finalize(object);
}static void physical_product_class_init(PhysicalProductClass *klass) {ProductClass *product_class = PRODUCT_BASE_CLASS(klass);product_class->get_details = physical_product_get_details;product_class->get_price = physical_product_get_price;GObjectClass *object_class = G_OBJECT_CLASS(klass);object_class->finalize = physical_product_finalize;
}
static void physical_product_init(PhysicalProduct *self) {}PhysicalProduct* physical_product_new(const gchar *name, gdouble price, gdouble weight) {PhysicalProduct *self = g_object_new(TYPE_PHYSICAL_PRODUCT, NULL);self->name = g_strdup(name);self->price = price;self->weight = weight;return self;
}/* -------------------------数字类: DigitalProduct
------------------------- */
#define TYPE_DIGITAL_PRODUCT (digital_product_get_type())
G_DECLARE_FINAL_TYPE(DigitalProduct, digital_product, DIGITAL_PRODUCT, BASE, Product)
struct _DigitalProduct {Product parent_instance;gchar *name;gdouble price;gdouble file_size;
};
G_DEFINE_TYPE(DigitalProduct, digital_product, TYPE_PRODUCT)
static const gchar* digital_product_get_details(Product *self) {DigitalProduct *product = (DigitalProduct*)self;return g_strdup_printf("Digital Product: %s, Price: %.2f, File Size: %.2fMB",product->name, product->price, product->file_size);
}
static gdouble digital_product_get_price(Product *self) {DigitalProduct *product = (DigitalProduct*)self;return product->price;
}
/* 新增方法:获取文件大小 */
gdouble digital_product_get_file_size(DigitalProduct *self) {return self->file_size;
}
static void digital_product_finalize(GObject *object) {DigitalProduct *self = (DigitalProduct*)object;g_free(self->name);G_OBJECT_CLASS(digital_product_parent_class)->finalize(object);
}
static void digital_product_class_init(DigitalProductClass *klass) {ProductClass *product_class = PRODUCT_BASE_CLASS(klass);product_class->get_details = digital_product_get_details;product_class->get_price = digital_product_get_price;GObjectClass *object_class = G_OBJECT_CLASS(klass);object_class->finalize = digital_product_finalize;
}
static void digital_product_init(DigitalProduct *self) {}
DigitalProduct* digital_product_new(const gchar *name, gdouble price, gdouble file_size) {DigitalProduct *self = g_object_new(TYPE_DIGITAL_PRODUCT, NULL);self->name = g_strdup(name);self->price = price;self->file_size = file_size;return self;
}
int main() {/* 创建产品 */PhysicalProduct *laptop = physical_product_new("Laptop", 1500.00, 2.5);DigitalProduct *ebook = digital_product_new("E-Book", 15.00, 50.0);/* 获取产品详情 */Product *products[] = {PRODUCT_BASE(laptop), PRODUCT_BASE(ebook)};for (int i = 0; i < 2; i++) {Product *product = products[i];printf("%s\n", PRODUCT_BASE_GET_CLASS(product)->get_details(product));printf("%f\n", PRODUCT_BASE_GET_CLASS(product)->get_price(product));}printf("File Size: %.2f MB\n", digital_product_get_file_size(ebook));/* 释放资源 */g_object_unref(laptop);g_object_unref(ebook);return 0;
}