Glib 入门收集

参考1

Glib 入门介绍
https://blog.csdn.net/quicmous/article/details/117706271

GLib 官网:https://developer.gnome.org/glib/。官网是这样介绍 GLib 的
GLib 是一个通用实用程序库,它提供了许多有用的数据类型、宏、类型转换、字符串实用程序、文件实用程序、主循环抽象等等。它可以在许多类似 UNIX 的平台上工作,也可以在 Windows 和 osx 上工作。GLib 是根据 GNU 通用公共许可证(GNU-Lesser-General-Public-License,GNU-LGPL)发布的。

GLib 开源包

glib 是 c 语言最重要的开源软件包之一,是支持 c 语言活力无限的重要支柱。我们可以看到许多基于 glib 的开源工具,比如 gtk、gnome、gsoap、gstreamer 等等,俨然一个庞大的 g 氏家族。

glib 不是一个学院派的东西,也不是凭空想出来的,完全是在开发 gtk+ 的过程中,慢慢总结和完善的结果。如果你是一位长期使用 C 语言程序员,现在让你讲讲写程序的苦恼,你可能有很多话要说。但如果你有时间研究一下glib,你会发现,很多苦恼已不再成其为苦恼,glib里很多东西正是你期望已经久的。

GObject —— GLib 的 OOP 特性

gobject 是 glib 的精粹,glib 是用 C 实现的,但在很大程序是基于面向对象思想设计的,gobject 是所有类的基类。signal 在其中也是一大特色,signal 与操作系统中的 signal 并不一样,它是类似消息一样的东西,让消息在各个对象间传递,但尽量降低对象间的耦合。仔细读一下它的代码,唯一想说的话就是“绝!”。

GLib 中的 “STL”

动态数组、链表、哈希表等通用容器,在不同的公司,在不同的时期,在不同的情况下,我们每个人对每一种容器,可能都实现过N次以上。甚至在同一个项目里,出现几份链表的实现,也并非罕见。一直在抱怨,标准C中为什么没有类似于STL的标准容器,让全世界的程序员在数以万次的重复实现它们。不过,还算走运,有了glib,恶梦在此终结了。glib提供了动态数组、单/双向链表、哈希表、多叉树、平衡二叉树、字符串等常用容器,完全是面向对象设计的,实现得非常精致。不用白不用,别客气了。

GLib 的跨平台支持

你开发过跨硬件平台的软件吗?是不是常常为硬件平台的差异而苦恼呢?字节顺序是常见的问题之一,大端格式,小端格式,还是PDP格式的?这样差异造成的BUG会浪费不少时间,同时让代码晦涩难读。glib提供了一套完整的宏,利用这些宏编写程序,问题大大简化了。

你开发过跨操作系统的软件吗?在不同的平台下,很多函数有相同的功能,但函数原型,返回值差异巨大,也有的貌合神离,相同的名称有着不同的意义,请看下面这张清单:

  动态库加载函数

   线程函数

   信号量函数

   互斥锁函数

   事件函数

   字符集转换函数

   原子操作函数

   创建进程函数

   时间格式

   IO函数

为完成相同的功能,你却要为此写出不同的代码。那怕只是一个简单的封装,这么多,你烦不烦?用 glib 吧,它的作者们都是高手中的高手,对不同的平台的理解程度,远远超出你和我,而且这些程序经过大量的应用程序测试,已经非常的稳定了,放心的用吧。

GLib 词法分析

你写过读取配置文件的模块吧,像读取 ini 这样简单格式的文件,当然不在话下,要读 markup 语言格式的配置文件,难度可能大了点,虽然不是不可能,但除非是为了学习,何必自己找麻烦呢。 glib 里提供了词法分析、markup 语言解析、ini 文件存取等功能,你完全不用为此担忧。

不管是命令行程序,还是 GUI 程序,或者后台服务进程,通过命令参数来控制程序的行为,都是开发人员惯用的手法。从命令行参数取到有用的信息,不难,遍历一遍不就行了吗?但在每个程序中都来遍一次,你不觉得很单调吗?我们的时间很宝贵,浪费时间做这种事情,不值得吧。glib 的作者们早考虑到了,它提供了这样的功能,你调用的它的函数,可能轻松的取得所要的命令行参数。

对于正则表达式,Win32 下的开发人员可能用得少一点,而在 Linux 下的 Shell 里,它却是不可或缺之物。有没有想到在自己的程序中使用的它呢,在有的情况下,使用正则表达式,可能会大大降低开发的难度,提高易用性。glib也想到了这一点,它提供了简单的正则表达式功能,当然,用与不用完全取决于你自己。

GLib 错误追踪

在程序里,如果程序出错了,特别是调了不该调用的函数,你是不是很想知道是谁调了它?大多数时候用 debuger 是最好的选择,在某些情况下,没有 debuger 可用,或者在 debuger 里重现不了这个问题,你会不会觉得很无助?别怕,glib 提供了一套跨平台的 backtrace 函数,有了它,你可以很容易找到元凶了。

Glib 日志功能

如果读过一些大型的开源项目,你会发现,差不多每个项目都有一套自己的log函数,用于记录程序运行的调试或者审计信息。也有可能,你自己都曾在不同的项目里实现过好几次这个功能,第一次实现会觉得很好玩,会学到了一些东西,后来就会发现自己在做无用功。重复就是浪费,重复就是犯罪,glib想到了这一点,它实现了一套完整的log机制,供大家在不同的项目中使用。

GLib 数学计算

产生质数的算法不难,在我们的程序里也像是星外来客,很少使用,常常忽略了它。所谓书到用时方恨少,有这样的东东,说不定就有用得到它的时候。glib提供了这样的功能,同时还提供了一个较好的随机数算法。

Glib Shell 功能

Linux Shell 里的自动补完功能很好用吧,从 Linux 转移到 Win32 下工作的开发人员,常常抱怨Win32 的 Shell 里没有这个功能,其实 Win32 下也是有的,把注册表里的一个选项打开就行了。不管怎么样,总之这个功能太有用了,没有它,你都会觉得少了点什么,全身不自在,glib里连这个功能都提供了,是不是很人性化呢?

Glib 内存管理

内存问题!还是内存问题!如果你没有为内存问题而苦恼过,我都怀疑你是不是一个真正的C语言程序员。内存泄露、访问越界、空指针、野指针和内存优化等问题,是不是都曾让你夜不能昧?有些工具可以帮助你,但这不是万能的良药,好好写你的程序才是第一要义。glib提供了一些的手段,也可以在一定程度上减轻你的痛苦。

libc、glibc 和 glib 的关系

libc 实际上是一个泛指。凡是符合实现了 C 标准规定的内容,都是一种 libc 。

glibc 是 GNU 组织对 libc 的一种实现。它是 unix/linux 的根基之一。微软也有自己的 libc 实现,叫 msvcrt 。嵌入式行业里还常用 uClibc ,是一个迷你版的 libc 。

glib 与 libc、glibc 其实没啥关系,它是自成体系的一套面向对象的开源工具库。

参考资料:

GLib Reference Manual:https://developer.gnome.org/glib/stable/
fingding:https://blog.csdn.net/fingding/article/details/6881768
摩云飞:https://my.oschina.net/moooofly/blog/126260
本文后半部分引用了未知来源的文章,内容写得很精彩!如作者能看到本文,请与本人联系,我将相关版权说明补充完整。无论如何,我将十分感谢这位作者透彻地解读,让我有兴趣重新组织这篇短文!

参考2

gnome是基于gtk+开发的一套桌面环境,gnome和KDE作为两大最流行的桌面环境,在全世界广泛使用。只要是在Linux下工作的开发人员,对于gtk+一定不陌生。而对于glib,这个gtk+下的无名英雄,其功能强大却鲜为人知。今天,在这里简要介绍一下,如果你是开发人员,看完本文,相信你会爱上它的。

glib不是gllibc,尽管两者都是基于(L)GPL的开源软件。但这一字之差却误之千里,glibc是GNU实现的一套标准C的库函数,而glib是gtk+的一套函数库。在linux平台上,像其它任何软件一样,glib依赖于glibc。

glib不是一个学院派的东西,也不是凭空想出来的,完全是在开发gtk+的过程中,慢慢总结和完善的结果。如果你是一个工作3年以上的C语言程序员,现在让你讲讲写程序的苦恼,你可能有很多话要说,但如果你有时间研究一下glib,你会发现,很多苦恼已不再成其为苦恼,glib里很多东西正是你期望已经久的。

gobject是glib的精粹,glib是用C实现的,但在很大程序是基于面向对象思想设计的,gobject是所有类的基类。signal在其中也是一大特色,signal与操作系统中的signal并不一样,它是类似消息一样的东西,让消息在各个对象间传递,但尽量降低对象间的耦合。仔细读一下它的代码,唯一想说的话就是“绝!”。

动态数组、链表、哈希表等通用容器,在不同的公司,在不同的时期,在不同的情况下,我们每个人对每一种容器,可能都实现过N次以上。甚至在同一个项目里,出现几份链表的实现,也并非罕见。一直在抱怨,标准C中为什么没有类似于STL的标准容器,让全世界的程序员在数以万次的重复实现它们。不过,还算走运,有了glib,恶梦在此终结了。glib提供了动态数组、单/双向链表、哈希表、多叉树、平衡二叉树、字符串等常用容器,完全是面向对象设计的,实现得非常精致。不用白不用,别客气了。

你开发过跨硬件平台的软件吗?是不是常常为硬件平台的差异而苦恼呢?字节顺序是常见的问题之一,大端格式,小端格式,还是PDP格式的?这样差异造成的BUG会浪费不少时间,同时让代码晦涩难读。glib提供了一套完整的宏,利用这些宏编写程序,问题大大简化了。

3

【glibc 和 glib】

  错误观点:glib 前面有个 "g" ,所以认为 glib 是 GNU 的东东;同时认为 glibc 是 glib 的一个子集。

  其实,glib 和 glibc 基本上没有太大联系,可能唯一的共同点就是,其都是 C 编程需要调用的库而已。

glib 是 Gtk+ 库和 Gnome 的基础。glib 可以在多个平台下使用,比如 Linux、Unix、Windows 等。glib 为许多标准的、常用的 C 语言结构提供了相应的替代物。
【glibc 和 libc】

glibc 和 libc 都是 Linux 下的 C 函数库。
libc 是 Linux 下的 ANSI C 函数库;glibc 是 Linux 下的 GUN C 函数库。

ANSI C 和 GNU C 有什么区别呢?

   ANSI C 函数库是基本的 C 语言函数库,包含了 C 语言最基本的库函数。这个库可以根据头文件划分为 15 个部分,其中包括:

<ctype.h>:包含用来测试某个特征字符的函数的函数原型,以及用来转换大小写字母的函数原型;
<errno.h>:定义用来报告错误条件的宏;
<float.h>:包含系统的浮点数大小限制;
<math.h>:包含数学库函数的函数原型;
<stddef.h>:包含执行某些计算 C 所用的常见的函数定义;
<stdio.h>:包含标准输入输出库函数的函数原型,以及他们所用的信息;
<stdlib.h>:包含数字转换到文本,以及文本转换到数字的函数原型,还有内存分配、随机数字以及其他实用函数的函数原型;
<string.h>:包含字符串处理函数的函数原型;
<time.h>:包含时间和日期操作的函数原型和类型;
<stdarg.h>:包含函数原型和宏,用于处理未知数值和类型的函数的参数列表;
<signal.h>:包含函数原型和宏,用于处理程序执行期间可能出现的各种条件;
<setjmp.h>:包含可以绕过一般函数调用并返回序列的函数的原型,即非局部跳转;
<locale.h>:包含函数原型和其他信息,使程序可以针对所运行的地区进行修改。
地区的表示方法可以使计算机系统处理不同的数据表达约定,如全世界的日期、时间、美元数和大数字;
<assert.h>:包含宏和信息,用于进行诊断,帮助程序调试。
上述库函数在其各种支持 C 语言的 IDE 中都是有的。

   GNU C 函数库是一种类似于第三方插件的东西。由于 Linux 是用 C 语言写的,所以 Linux 的一些操作是用 C 语言实现的,因此,GUN 组织开发了一个 C 语言的库 以便让我们更好的利用 C 语言开发基于 Linux 操作系统的程序。 不过现在的不同的 Linux 的发行版本对这两个函数库有不同的处理方法,有的可能已经集成在同一个库里了。

查看当前系统的 glibc 版本的方法:

4

https://blog.csdn.net/field1003/article/details/123420966
https://download.csdn.net/download/field1003/84948172

《GLib库入门与实践》专栏的配套源码。专栏地址:https://blog.csdn.net/field1003/article/details/123420966。
还在为C语言开发时重复造轮子苦恼吗,链表、队列、线程池,统统都得自己实现?先了解一下GLib-2.0库。
GLib库是用C语言实现的一个通用的、可移植的实用程序库,由GNOME的GTK小组开发并维护,最早用在GTK+程序开发上,后来被越来越多的程序使用。
GLib由三大部分组成——GLib、GObject和GIO,GLib是一套C语言工具集,GObject是基于C语言实现的对象系统,GIO是基于GObject的一套简单易用的VFS接口。
GLib包含了字符串操作、文件操作、数据校验、编解码、字符集转换、随机数生成器、命令行解析器、xml解析器、正则表达式、单链表、双链表、 数组、指针数组、双端队列、哈希表、平衡二叉树、N维树、泛型、主循环、多线程、线程池、异步队列、内存分配、内存片段、错误系统、测试框架等等一系列功能,称得上是C语言开发人员的军刀,值得研究。

./usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
./usr/lib/x86_64-linux-gnu/libglibmm-2.4.so.1.3.0
./usr/lib/x86_64-linux-gnu/libglibmm_generate_extra_defs-2.4.so.1
./usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.6400.2
./usr/lib/x86_64-linux-gnu/libglibmm-2.4.so.1
./usr/lib/x86_64-linux-gnu/libglib-2.0.so
./usr/lib/x86_64-linux-gnu/libglibmm_generate_extra_defs-2.4.so.1.3.0
./usr/lib/x86_64-linux-gnu/libglib-2.0.a

5

pkg-config --cflags --libs glib-2.0
在这里插入图片描述

GLib-2.0库的三大组成部分
我们通常所说的GLib库一般都是指GLib-2.0库。GLib-2.0由三大部分组成——GLib、GObject和GIO,GLib是一套C语言工具集,GObject是基于C语言实现的对象系统、GIO是基于GLib和GObject的一套简单易用的VFS接口。GLib-2.0库的三个重要组成部分如下:

GLib:核心C程序库,包含了基础、核心应用支持、实用工具集、数据类型等内容。
GObject:一个基于C语言实现的对象系统,使C语言也可以面向对象编程。
GIO:基于GObject实现的一套便捷的vfs读写接口,包括文件操作、流操作、网络支持、TLS支持、D-Bus支持、应用支持等核心部分。

什么是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语言工具库。

6 查看 glib 版本

在这里插入图片描述

jack@jack-VMware-Virtual-Platform:~$ pkg-config --modversion glib-2.0
2.64.2
jack@jack-VMware-Virtual-Platform:~$ pkg-config --modversion gtk+-2.0
2.24.32
jack@jack-VMware-Virtual-Platform:~$

https://download.gnome.org/sources/glib/2.64/

GLib-2.0库遵循LGPL协议,其源码可以从官方获取。

源码获取途径
最新的GLib-2.0库可以从GNOME官方的GitLab上获取:
https://gitlab.gnome.org/GNOME/glib

历史源码可从下面网站获取:
https://download-fallback.gnome.org/sources/glib/

本系列文章使用的GLib-2.0源码是GLib-2.56.4。

/usr/include/glib-2.0/glib/gtypes.h:32:10: fatal error: glibconfig.h: No such file or directory
./usr/lib/x86_64-linux-gnu/glib-2.0/include/glibconfig.h

他那个例子
glib_examples/glib_testframe/glib_testframe_basic/
到最底层 里面 执行 cmake .
然后 执行 make
不要在glib_examples/glib_testframe/ 这一层执行 cmake .
会出错

麒麟银河 系统:

glib-2.64.2
sudo apt install libelf-dev

rm -rf _build/

% tar xf glib-@GLIB_VERSION@.tar.gz # unpack the sources
% cd glib-@GLIB_VERSION@ # change to the toplevel directory
% meson _build # configure the build
% ninja -C _build # build GLib

[ Become root if necessary ]
% ninja -C _build install # install GLib
glib-2.64.2

112
gcc -Wall main.c `pkg-config --cflags --libs glib-2.0` -o main
gcc -Wall `pkg-config --cflags glib-2.0` main.c `pkg-config --libs glib-2.0` -o main
ldd main

testgdate.c
gcc -Wall testgdate.c `pkg-config --cflags --libs glib-2.0` -o testgdate

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值