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.pswp.cn/bicheng/77343.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77343.shtml
英文地址,請注明出處:http://en.pswp.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;…