热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Glib入门介绍

GLib官网:https:developer.gnome.orgglib。官网是这样介绍GLib的:GLib是一个通用实用程序库,它提供了

GLib 官网:https://developer.gnome.org/glib/。官网是这样介绍 GLib 的:

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

 

先八卦一下 GLib 的黑历史。

GNU 的故事

话说有个叫  Richard Stallman 的家伙,立志要开发自由软件。他先搞了个 GNU宣言,于是就有了 GNU 这个缩写。GNU 的英文全称就是 “GNU's Not Unix!”。尽管 GNU 不是 UNIX,其实 GNU 的目标是与 Unix 兼容的自由软件。

GNU是“GNU's Not UNIX”的递归缩写,为避免与gnu(非洲牛羚,发音与“new”相同)这个单词混淆,Stallman 宣布 GNU 应当发音为“Guh-NOO”(/ˈgnuː/ ),与“canoe”发音相似。

GIMP 来了

后来,Peter Mattis 和 Spencer Kimhall 为 GNU 开发一个图像处理软件包 GIMP。GIMP 是 GNU Image Manipulation Program(GNU图像处理程序)的缩写。

GTK+ 的诞生

GIMP 是处理图像的工具包,自己怎么着也应该弄出来一个图形界面吧?我们不得不佩服老美程序员的精神,为了这个图形界面,竟然搞出来一个通用的界面设计工具。然而,这并没完结。为了把 GTK+ 弄得好一点,竟然又继续深挖,搞出了一个 OOP 的工具包 GLib。

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 其实没啥关系,它是自成体系的一套面向对象的开源工具库。

 


参考资料:

  1. GLib Reference Manual:https://developer.gnome.org/glib/stable/
  2. fingding:https://blog.csdn.net/fingding/article/details/6881768
  3. 摩云飞:https://my.oschina.net/moooofly/blog/126260

本文后半部分引用了未知来源的文章,内容写得很精彩!如作者能看到本文,请与本人联系,我将相关版权说明补充完整。无论如何,我将十分感谢这位作者透彻地解读,让我有兴趣重新组织这篇短文!

 

 


推荐阅读
  • 本文介绍了5个基本Linux命令行工具的现代化替代品,包括du、top和ncdu。这些替代品在功能上进行了改进,提高了可用性,并且适用于现代化系统。其中,ncdu是du的替代品,它提供了与du类似的结果,但在一个基于curses的交互式界面中,重点关注占用磁盘空间较多的目录。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
author-avatar
手机用户2502916627
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有