C 程序工具包-GLib
2013-04-09 12:00:19 阿炯

GLib 是一个包含很多有用的 C 程序的开发包,例如树、哈希、列表等。GLib 原是属于 GTK 工具包的一部分,但到了GTK+第二版,开发者决定把跟图形界面无关的代码分开,这些代码于是就组装成了GLib这个单独项目。Glibc 是提供系统调用和基本函数的 C 库,比如open, malloc, printf等,所有动态连接的程序都要用到它。因为GLib具有跨平台特性,所以用它编写的程序可以无需进行大幅度修改就可以在其他程序上编译和运行。使用LGPLv2.1协议授权。

GLib 提供了多种高级的数据结构,如内存块、双向和单向链表、哈希表、动态字符串以及字符串工具(例如词法分析器,字符串切分等)、动态数组、平衡二叉树、n-叉树、键值存储、关系和元组,还有带有缓存的内存管理。还实现了线程相关的函数、多线程编程以及相关的工具,例如原始变量访问、互斥锁、异步队列、安全内存池、消息传递和日志、钩子函数和计时器,同时消息传递还包含了字节序转换和IO channel。


Glib是Gtk库和Gnome的基础,可以在多个平台下使用,比如Linux、Unix、Windows等,为许多标准的、常用的C语言结构提供了相应的替代物,系C语言生态系统中一个相当全面的框架库。截止到2024年,没有任何一种跨平台C语言库在完善程度,代码质量,应用范围上的综合表现可以超过甚至比肩GLib。Glib Reference Manual 系开发者必不可少的参考手册。


GLib由五个库组成:
GObject –对象系统,包括类型系统GType
Glib
GModule
GThread
GIO



GObject 库继承了 ANSI C 标准,拥有一些常见的数据类型(不是所有的平台都提供64位整型),例如:
gchar​​:字符型
guchar​​:无符号字符型,和char相同
gunichar​​:32 位定宽 Unicode 字符型
gboolean​​:布尔型,其可以取两个值:TRUE和FALSE
gint8​​、​​gint16​​、​​gint32​​、​​gint64​​:有符号 8、16、32 和 64 位整数
guint8​​、​​guint16​​、​​guint32​​、​​guint64​​:无符号 8、16、32 和 64 位整数
gshort、glong、gint和short、long、int相同
gfloat​​:IEEE 754 标准单精度浮点数,和float完全等价
gdouble​​:IEEE 754 标准双精度浮点数,和double完全等价
gpointer​​:泛指针,对应于标准C的void*
gconstpointer:对于于标准C的const void*


GLib库叫GLib-1.0,形成于约1995到1997年间,当时提供的功能还比较少,后来于2002年升级到GLib-2.0,提供的功能也越来越丰富。多媒体开发框架-GStreamer也可认为是开发体系中重要的一环。

GLib-2.0库的三大组成部分

通常所说的GLib库一般都是指GLib-2.0库,由三大部分组成——GLib、GObject和GIO,GLib是一套C语言工具集,GObject是基于C语言实现的对象系统、GIO是基于GLib和GObject的一套简单易用的VFS接口。GLib-2.0库的三个重要组成部分如下:
1.GLib:核心C程序库,包含了基础、核心应用支持、实用工具集、数据类型等内容。
2.GObject:一个基于C语言实现的对象系统,使C语言也可以面向对象编程。
3.GIO:基于GObject实现的一套便捷的vfs读写接口,包括文件操作、流操作、网络支持、TLS支持、D-Bus支持、应用支持等核心部分。

通常在提到GLib-2.0库时,所指为包含GLib、GObject和GIO三大部分的GLib-2.0库,在提到GLib库时,一般专指GLib-2.0库的GLib部分而不包括GObject和GIO。

GLib2.0库中的GLib部分主要功能

GLib-2.0的GLib部分提供了许多有用的数据类型、宏、类型转换、字符串实用程序、文件实用程序、主循环抽象等等,具体包含:字符串操作、文件操作、数据校验、编解码、字符集转换、随机数生成器、命令行解析器、xml解析器、正则表达式、单链表、双链表、数组、指针数组、双端队列、哈希表、平衡二叉树、N维树、泛型、主循环、多线程、线程池、异步队列、内存分配、内存片段、错误系统、测试框架等等一系列功能。

GLib-2.0库授权协议

GLib-2.0库遵循LGPL协议。如果只是对GLib-2.0库调用,而不修改其源码,则自己写的代码不需要开源;如果修改了GLib-2.0的源码,也只需要开源与GLib-2.0相关的修改部分,不需要开放全部源码。因此与GPL相比,LGPL是一个相当宽松的许可协议。

GLib-2.0的可移植性

GLib-2.0库具有可移植性,支持市面上常见的如i386、i686、x86_64、armv5、armv7、armv8、aarch64、mips、mips64el、alphaev5、alphaev6、powerpc、sparc、riscv32及s390等等一系列架构及指令集,这里只列举出了部分,具体支持的CPU及指令集类型,可查看源码根目录下的config.guess文件。


一些通用的跨平台库无非就是用同一份应用程序的代码,可以编译出在多个平台上运行的可执行程序。


而 glib 就是这样的一个中间层跨平台库,它提供了很多常用的封装,其本身是用c写的一些utilities,即c的工具库,和libc/glibc(GNU C Library)没有关系。

glibc是GNU实现的一套标准C的函数库,而glib是gtk+在其v2.0时候独立出来的一套函数库;桌面环境gnome就是基于gtk+开发的一套桌面系统,而glib正是位于gtk后面的那位无名英雄。glibc是linux下面c标准库的实现,即GNU C Library。glibc本身是GNU旗下的C标准库,后来逐渐成为了Linux的标准c库,而Linux下原来的标准c库Linux libc逐渐不再被维护。

libc、glibc、glib三者区别与联系

libc
ANSI组织1989年发布了第一版C语言标准,称为C89,该标准于1999年被国际标准化组织(ISO)接收为国际标准,遂称之为C90(后来国际标准化组织又于1999年和2011年分别发布了C99和C11两版C语言标准)。凡是实现了C语言标准规定的内容的C函数库都可以称为libc库。很多厂商或组织都基于C标准实现过libc库,较为著名的有GNU组织的glibc、微软的msvcrt及嵌入式行业里常用的uclibc。

glibc
glibc由GNU开发,在Linux系统下实现了C语言标准规定的内容,该套C函数库逐渐成为了Linux下的标准C库,原来Linux下的标准C库Linux libc逐渐不再维护了,因此现在Linux发行版自带的libc库基本都是glibc,查看版本信息时可以看到类似“GNU C Library (GNU libc) stable release version 2.xx”的字样。

glib
glib是由GNOME的GTK小组开发并维护,由基础类型、核心应用支持、实用功能、数据类型及对象系统等部分组成,是一个有综合用途的C语言工具库。


GLib2是GNOME和GTK项目的底层核心C库,Linux上基本所有使用C+GTK开发的程序都使用了这个库,从GNOME/Xfce等桌面环境到位图处理程序GIMP,再到编辑器Geany,底层都大量使用了GLib2来提高C的开发效率。GLib2并不依赖GUI,使用C开发跨平台的服务器端程序也一样可以使用GLib2,完全可以把GLib2当成zlib那种跨平台的C库来用。GLib2是GNOME和GTK项目的结晶,包含了大量功能,能有效提高C的开发效率。


GLib2提供的数据类型:
双向链表——可以双向迭代的链表
单链表——可以单向迭代的链表
双端队列—双端队列数据结构
序列—可缩放列表
垃圾堆栈—维护一堆未使用的已分配内存块
哈希表—键和值之间的关联,因此给定一个键,就可以快速找到值
字符串—随着文本的添加而自动增长的文本缓冲区
字符串块—字符串组的高效存储
数组—随着元素的添加而自动增长的任意元素的数组
指针数组—指向任何类型数据的指针数组,它会随着新元素的添加而自动增长
字节数组—字节数组
平衡二叉树——键/值对的排序集合,为按顺序搜索和遍历进行了优化
n元树——具有任意数量分支的数据树
夸克——字符串和唯一整数标识符之间的双向关联
键控数据列表——可通过字符串或GQuark标识符访问的数据元素列表
数据集——将数据元素组与特定的内存位置相关联
GVariantType——GVariant类型系统简介
GVariant ——强类型值数据类型
GVariant格式字符串GVariant的varargs转换
GVariant文本格式GVariant的文本表示
参考计数——参考计数类型和功能
引用计数数据——使用引用计数语义分配的内存
原子引用计数数据——使用原子引用计数语义分配的内存
引用计数字符串——具有引用计数内存管理的字符串

比如GLib2提供的实用函数:
字符串实用函数——各种与字符串相关的函数
字符集转换——在不同字符集之间转换字符串
Unicode操作——对Unicode字符和UTF-8字符串进行操作的函数
Base64编码——以Base64格式编码和解码数据
数据校验和——计算数据的校验和
安全HMAC摘要——计算数据的HMAC
国际化—— gettext支持宏
日期和时间功能——日历计算和其他时间功能
GTimeZone —— 表示时区的结构
GDateTime —— 表示日期和时间的结构
随机数—伪随机数生成器
钩子函数——支持操纵钩子函数列表
杂项实用功能——一系列便携式实用功能
词法扫描器——一个通用的词法扫描器
计时器——记录经过的时间
衍生流程——流程启动
文件实用程序——各种与文件相关的功能
URI功能—— URI处理实用程序
主机名实用程序——互联网主机名实用程序
与Shell相关的实用程序——类似shell的
命令行处理命令行选项解析器——解析命令行选项
全局样式模式匹配——根据包含“*”(通配符)和“?”的模式匹配字符串
Perl兼容的正则表达式——根据正则表达式匹配字符串
正则表达式语法GRegex——支持的正则表达式的语法和语义
简单XML子集解析器——解析XML的子集
键值文件解析器——解析类似ini的配置文件
书签文件解析器——解析包含书签的文件
测试——测试框架
特定于UNIX的实用程序和集成——管道、信号处理
Windows兼容功能——Windows上的UNIX仿真
GUuid ——一个通用的唯一标识符


GLib的帮助文档包括以下9部分,其中核心应用支持、工具集和数据类型是最重要的三部分。
    GLib Overview // 概览
    GLib Fundamentals // 基础
    GLib Core Application Support // 核心应用支持
    GLib Utilities // 工具集
    GLib Data Types // 数据类型
    Deprecated APIs // 已废弃接口
    GLib Tools // 附属工具
    Index // 索引
    Annotation Glossary // 注释术语表

下面是GLib文档各部分包含的子项。

GLib Overview // 概览
    Compiling the GLib package //编译GLib库
    Cross-compiling the GLib package // 交叉编译GLib库
    Writing GLib Applications // 编写引用GLib库的程序
    Compiling GLib Applications // 编译引用GLib库的程序
    Running GLib Applications // 运行引用GLib库的程序
    Changes to GLib // GLib库版本兼容性问题
    Mailing lists and bug reports // 邮件列表和错误报告

GLib Fundamentals  // 基础
    Version Information // GLib版本
    Basic Types // 可移植的一些基本类型
    Standard Macros // 常用的宏
    Type Conversion Macros // 类型转换宏
    Byte Order Macros // 字节序转换宏
    Bounds-checking integer arithmetic // 带溢出检查功能的整型运算
    Numerical Definitions // 数学常数定义
    Miscellaneous Macros // 常用的宏
    Atomic Operations // 原子操作

GLib Core Application Support  // 核心应用支持
    The Main Event Loop // 主循环
    Threads // 线程
    Thread Pools // 线程池
    Asynchronous Queues // 异步队列
    Dynamic Loading of Modules // 可移植的动态链接库加载
    Memory Allocation // 内存分配
    Memory Slices // 内存切片
    IO Channels // IO通道
    Error Reporting // 错误系统
    Warnings and Assertions // 告警和断言
    Message Output and Debugging Functions // 日志和调试

GLib Utilities  // 工具集
    String Utility Functions // 字符串处理函数
    Character Set Conversion // 字符集转换函数
    Unicode Manipulation // Unicode相关函数
    Base64 Encoding // Base64编解码
    Data Checksums // 数据校验和
    Secure HMAC Digests // HMAC校验
    Internationalization // 国际化
    Date and Time Functions // 日期和时间函数
    GTimeZone // 时区
    GDateTime // 时间和日期
    Random Numbers // 随机数生成器
    Hook Functions // 钩子函数
    Miscellaneous Utility Functions // 多种通用工具
    Lexical Scanner // 词法扫描器
    Timers // 计时器
    Spawning Processes // 进程创建
    File Utilities // 文件操作
    URI Functions // URI操作
    Hostname Utilities // Hostname相关函数
    Shell-related Utilities // shell相关的命令行解析
    Commandline option parser // 命令行解析器
    Glob-style pattern matching // Glob样式通配符匹配器
    Perl-compatible regular expressions // PCRE正则表达式
    Regular expression syntax // 正则表达式语法(无代码)
    Simple XML Subset Parser //XML解析器
    Key-value file parser // Key-Value风格文件解析器(类似于ini文件)
    Bookmark file parser // 书签解析器
    Testing // GLib测试框架
    UNIX-specific utilities and integration // Unix专有的管道和信号
    Windows Compatibility Functions // 跨平台兼容性函数
    GUuid // 随机UUID生成器

GLib Data Types  // 数据类型
    Doubly-Linked Lists // 双向链表
    Singly-Linked Lists //  单向链表
    Double-ended Queues // 双端队列
    Sequences // 序列
    Trash Stacks // 已分配未使用内存管理器
    Hash Tables // 哈希表
    Strings // 字符串对象
    String Chunks // 字符串块
    Arrays // 普通数组
    Pointer Arrays // 指针数组
    Byte Arrays // 字节数组
    Balanced Binary Trees // 平衡二叉树
    N-ary Trees // N维树
    Quarks // 夸克
    Keyed Data Lists // 键值列表
    Datasets // 数据集
    GVariantType // 泛型系统
    GVariant // 泛型
    GVariant Format Strings // 泛型格式字符串
    GVariant Text Format // 泛型文本格式

Deprecated APIs  // 已废弃接口
    Deprecated thread API // 已废弃的线程接口
    Caches // 缓存
    Relations and Tuples // 关系和元组
    Automatic String Completion // 字符串自动补齐

GLib Tools  // 附属工具
    glib-gettextize // 国际化
    gtester // 测试框架相关
    gtester-report // 测试报告相关

Index  // 索引
Annotation Glossary  // 注释术语表


最新版本:2.36
Signal handlers connected with g_signal_connect_object() are now automatically disconnected on target object destruction.
GIO now has kqueue support for GFileMonitor (BSDs and Mac OS).
UNIX signal sources now allow watching SIGUSR1 and SIGUSR2.
In g_get_home_dir(), the $HOME variable is no longer ignored, and taken into consideration in favor of GECOS entries.
GUnixFdSource was added as a new method to add file descriptors to the main loop.
Further new APIs were added.
Many bugs were fixed


最新版本:2.24
本次发布包含一些已知问题修复,5个安全问题漏洞修复,删除一些旧有功能函数,以及新增一些数学函数(nextup*()和 nextdown*())。更多具体改进信息以及Bug修复记录,可查看发行说明

最新版本:2.31
此版本的重要变更包括引入对 C2X 标准的初始支持、与 DNS 存根解析器(DNS stub resolver)相关的变更、新的 pthread_clockjoin_np() POSIX 线程扩展,以及与时间相关的函数的许多更改等。下面是对这些变更的简单介绍:
GNU C Library 现在支持功能测试宏 _ISOC2X_SOURCE,以启用 ISO C2X 标准草案中的功能。GNU C Library 仅支持该草案标准中的某些功能,并且由于该草案正在积极开发中,因此该宏启用的功能集易于更改。通过 _GNU_SOURCE 或使用"gcc-std=gnu2x"进行编译也可以启用 C2X 的功能。
将结果四舍五入为更窄类型的 <math.h> 函数现在在 <tgmath.h> 中具有相应的类型通用宏,如 TS 18661-1:2014 中所定义以及 TS 18661-3:2015(由 Clarification Request 13 的决议进行了修订)。
添加 pthread_clockjoin_np 函数,从而可以与具有特定时钟的终止线程进行连接。它允许等待 CLOCK_MONOTONIC 和 CLOCK_REALTIME。此函数是 GNU 扩展。
添加了新的语言环境:mnw_MM(Mon 语言为缅甸语)。
如果通过 /etc/resolv.conf 中的 options 指令设置了 trust-ad 选项(或者如果在 _res.options 中设置了 RES_TRUSTAD),则 DNS 存根解析器将有选择地在查询中发送认证数据位(AD, authenticated data)。在这种模式下,名称服务器提供的 AD 位可用于调用 res_search 和相关功能的应用程序。在默认模式下,未在查询中设置 AD 位,而是在响应中自动将其清除,表明缺乏 DNSSEC 验证。因此,名称服务器和它们的网络路径被视为不可信。


项目主页:http://www.gnu.org/software/libc/