linux的glib库使用

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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/77343.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vs2022使用git方法

1、创建git 2、在cmd下执行 git push -f origin master &#xff0c;会把本地代码全部推送到远程&#xff0c;同时会覆盖远程代码。 3、需要设置【Git全局设置】&#xff0c;修改的代码才会显示可以提交&#xff0c;否则是灰色的不能提交。 4、创建的分支&#xff0c;只要点击…

SAP ECCS 标准报表 切换为EXCEL电子表格模式

在解决《SAP ECCS标准报表在报表中不存在特征CG细分期间 消息号 GK715报错分析》问题过程中通过DEBUG方式参照测试环境补录数据后&#xff0c;不再报GK715错误&#xff0c;此时用户要的很急&#xff0c;要出季报。要求先把数据导出供其分析出季报。 采用导出列表方式&#xff…

基于 Python 和 OpenCV 技术的疲劳驾驶检测系统(2.0 全新升级,附源码)

大家好&#xff0c;我是徐师兄&#xff0c;一个有着7年大厂经验的程序员&#xff0c;也是一名热衷于分享干货的技术爱好者。平时我在 CSDN、掘金、华为云、阿里云和 InfoQ 等平台分享我的心得体会。 &#x1f345;文末获取源码联系&#x1f345; 2025年最全的计算机软件毕业设计…

MATLAB项目实战(一)

题目&#xff1a; 某公司有6个建筑工地要开工&#xff0c;每个工地的位置&#xff08;用平面坐标系a&#xff0c;b表示&#xff0c;距离单位&#xff1a;km&#xff09;及水泥日用量d(t)由下表给出&#xff0e;目前有两个临时料场位于A(5,1)&#xff0c;B(2,7)&#xff0c;日储…

[250417] Fedora 42 正式发布,搭载 Linux 6.14 内核和 GNOME 48 桌面环境

目录 Fedora 42 正式发布全新的 Anaconda Web UI 安装程序KDE Plasma 荣升官方版本 (Edition)全新 Fedora COSMIC Spin 登场GNOME 48 桌面环境更新其他重要改进获取与升级 Fedora 42 正式发布 Fedora Linux 42 现已正式发布&#xff01;此版本基于最新的 Linux 内核 6.14 构建…

开源技术如何助力中小企业实现财务管理自主化?

中小企业的数字化困境与开源机遇 国际数据公司&#xff08;IDC&#xff09;研究显示&#xff0c;全球67%的中小企业因高昂的软件成本和僵化的功能设计&#xff0c;未能有效推进数字化转型。传统商业软件常面临三大矛盾&#xff1a; 功能冗余与核心需求缺失&#xff1a;标准化系…

JVM考古现场(二十二):降维打击·用二向箔优化内存模型

"警报&#xff01;三维堆内存正在经历二维化坍缩&#xff01;" 我腰间的玄铁令突然震动&#xff0c;在蜀山剑派的量子剑阵中投射出诡异的曼德博分形——这是三体文明发动降维打击的铁证&#xff01; 楔子&#xff1a;二向箔奇点降临 昆仑镜监控日志&#xff1a; // …

详细解释MCP项目中安装命令 bunx 和 npx区别

详细解释 bunx 和 npx 1. bunx bunx 是 Bun 的一个命令行工具&#xff0c;用于自动安装和运行来自 npm 的包。它是 Bun 生态系统中类似于 npx 或 yarn dlx 的工具。以下是 bunx 的主要特点和使用方法&#xff1a; 自动安装和运行&#xff1a; bunx 会自动从 npm 安装所需的包…

Docker详细使用

Docker详细使用 文章目录 Docker详细使用使用场景docker安装常用命令帮助启动类命令镜像命令网络命令容器命令compose&#xff08;服务编排&#xff09; 功能列表存储&#xff08;挂载本地&#xff09;介绍使用⽬录挂载卷映射 网络介绍使用 DockerfileCompose介绍使用 使用场景…

Ubuntu24.04搭建ESP8266_RTOS_SDK V3.4开发环境

【本文发布于https://blog.csdn.net/Stack_/article/details/147194686&#xff0c;未经允许不得转载&#xff0c;转载须注明出处】 需要有Linux使用基础&#xff0c;自行准备 1、VM17 Pro &#xff08;自行搜索教程安装&#xff09; 2、ubuntu-24.04-desktop-amd64 &#xff0…

微信小程序实现table样式,自带合并行合并列

微信小程序在代码编写过程好像不支持原生table的使用&#xff0c;在开发过程中偶尔又得需要拿table来展示。 1.table效果展示 1.wxml <view class"table-container"><view class"table"><view class"table-row"><view cla…

前端面试-React篇

核心概念与虚拟DOM React的虚拟DOM如何工作&#xff1f;Diff算法优化策略是什么&#xff1f;JSX的本质是什么&#xff1f;与模板引擎&#xff08;如Vue&#xff09;有何区别&#xff1f;React组件生命周期&#xff08;类组件&#xff09;的关键阶段是什么&#xff1f;受控组件…

LFM调制信号分类与检测识别

LFM调制信号分类与检测识别 LFM调制信号分类识别AlexNet网络识别InceptionV3、ResNet-18、ResNet-50网络识别 LFM调制信号检测识别 LFM调制信号分类识别 支持识别LFM信号、间歇采样干扰(ISRJ)、灵巧噪声干扰(SNJ)、扫频干扰(SJ)、瞄准干扰(AJ)、阻塞干扰(BJ)、密集假目标干扰(…

Linux 常用命令总结

Linux 常用命令总结 Linux 命令行是系统管理和开发的核心工具&#xff0c;掌握常用命令可以极大提升效率。本文全面总结 Linux 常用命令&#xff0c;涵盖文件操作、进程管理、网络管理、系统监控、用户管理、软件安装等多个方面&#xff0c;适合初学者和高级用户参考。 1. 文件…

RPCRT4!OSF_CCONNECTION::OSF_CCONNECTION函数分析之创建一个RPCRT4!OSF_CCALL--RPC源代码分析

RPCRT4!OSF_CCONNECTION::OSF_CCONNECTION函数分析之创建一个RPCRT4!OSF_CCALL 第一部分&#xff1a; 1: kd> p RPCRT4!OSF_CCONNECTION::OSF_CCONNECTION0x167: 001b:77bf6957 393dec35c877 cmp dword ptr [RPCRT4!gfRPCVerifierEnabled (77c835ec)],edi 1: kd> …

量化视角:比特币美债黄金三角博弈的DeepSeek推演

【AI分析】近期全球金融市场呈现罕见的三重分化态势&#xff1a;比特币单日振幅超35%、美债收益率创年内最大单日波动、黄金价格突破3271美元/盎司&#xff0c;刷新有记录以来的最高价。这种极端行情背后&#xff0c;折射出AI模型捕捉到的市场结构性矛盾与资金流动新逻辑。 一…

markdown导出PDF,PDF生成目录

1、vscode中安装markdown插件&#xff0c;将编辑的文件导出PDF。 2、安装PDF Guru Anki软件 百度网盘&#xff1a;通过网盘分享的文件&#xff1a;PDFGuruAnki 链接: https://pan.baidu.com/s/1nU6avM7NUowhEn1FNZQKkA 提取码: aues PDF中不同的标题需要通过矩形框标注差异&a…

FastAPI与SQLAlchemy数据库集成

title: FastAPI与SQLAlchemy数据库集成 date: 2025/04/17 15:33:34 updated: 2025/04/17 15:33:34 author: cmdragon excerpt: FastAPI与SQLAlchemy的集成通过创建虚拟环境、安装依赖、配置数据库连接、定义数据模型和实现路由来完成。核心模块包括数据库引擎、会话工厂和声…

OSCP - Proving Grounds - DriftingBlues6

主要知识点 路径爆破dirtycow内核漏洞提权 具体步骤 总体来讲&#xff0c;这台靶机还是比较直接的&#xff0c;没有那么多的陷阱,非常适合用来学习 依旧是nmap开始,只开放了80端口 Nmap scan report for 192.168.192.219 Host is up (0.42s latency). Not shown: 65534 cl…

电视盒子 刷armbian

参考 中兴电视盒子中兴B860AV3.2-M刷Armbian新手级教程-CSDN博客 1.刷安卓9 带root版本 a. 下载安卓线刷包 链接&#xff1a;https://pan.baidu.com/s/1hz87_ld2lJea0gYjeoHQ8A?pwdd7as 提取码&#xff1a;d7as b.拆机短接 3.安装usbburning工具 使用方法 &#xff0c;…