当前位置:首页 > 代码 > 正文

glib源代码(glibc源码)[20240428更新]

admin 发布:2024-04-28 05:13 151


今天给各位分享glib源代码的知识,其中也会对glibc源码进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

请教rpm包中glib和glib-devel的包与GLIB源码编译区别

devel 包主要是供开发用,至少包括以下2个东西: 1. 头文件 2. 链接库 有的还含有开发文档或演示代码。 以 glib 和 glib-devel 为例: 如果你安装基于 glib 开发的程序,只需要安装 glib 包就行了。 但是如果你要编译使用了 glib 的源代码

如何使用glib工具集管理c数据

首先研究 GLib 的范畴。

GLib 是一个提供了很多实用定义和函数的底层程序库,包括基本类型及其限定的定义、标准宏、类型转化、字节次序、内存分配、警告与断言、消息日志、计时器、 字符工具、钩子函数、词法扫描器、模块的动态加载,以及自动的字符串补齐。

GLib 还定义了很多数据结构(以及它们相关的操作),包括:

* 内存块(Memory chunks)

* 双向链表(Doubly-linked lists)

* 单向链表(Singly-linked lists)

* 散列表(Hash tables)

* 字符串(Strings,可以动态增长)

* 字符块(String chunks,成组的字符串)

* 数组(Arrays,当增加元素时其大小能够增长)

* 平衡二叉树(Balanced binary trees)

* N-叉树(N-ary trees)

* Quarks(字符串和唯一整型标识符的双向关联)

* 有关键字的数据列表(Keyed data lists,通过字符串或者整型 id 访问其数据元素的列表)

* 关系(Relations)和元组(tuples)(可以由任意数目的域进行索引的数据表)

* 缓存

每个程序都必须管理数据

编写程序是为了处理数据。程序可能会从文件中读出一个名字列表、通过一个图形 用户界面向用户询问某些数据,或者从一个外部的硬件设备加载数据。但数据一旦 到了程序中,就需要保持对它的追踪。用来管理数据的函数和变量称为 数据结构 或 容器。

如果使用 C 编写代码,那么您会发现它极其缺乏复杂的数据结构。当然,有很多存 储数据的简单方法:

* 基本类型 —— int、float、char 等等。

* 枚举(enum),可以保存整数的一系列符号名称。

* 数组(array),这是 C 中最灵活的数据结构。

数组可以保存基本类型的数据,或者一系列任意类型的数据,或者指向任意类型数 据的指针。

但是数组也有很多局限性。它们的大小不能改变,所以,如果为一个拥有十个元素 的数组分配了内存,却发现需要向其中放置十一个元素,那么就得创建一个新数组 ,将旧的元素拷贝过来,然后添加并新的元素。如果要遍历数组中的每一个元素, 那么,或者需要始终知道数组中有多少个元素,或者要确保在数组的末尾处有某种 “数组结束”标记,以使得您能够知道何时停止。

通过使用链表和二叉树等标准容器,在 C 中保持对数据的追踪的问题已经多次得到 解决。每一位刚开始学习计算机科学专业的学生都会使用一个数据结构类;教师肯 定会布置一系列编写那些容器的实现的练习。在编写这些数据结构时,学生会意识 到它们是多么难以处理;粗心的学生经常会犯诸如悬空指针(dangling pointer) 和重复 释放内存(free) 的错误。

编写单元测试会有很大帮助,但是,总的来说,为每个新程序重新编写相同的数据 结构是一个费力不讨好的任务。

内置的数据结构

简言之就是,在什么地方内置数据结构会有所帮助。有一些语言会内置附带这些容 器。C++ 包含标准模板库(Standard Template Library,STL),它有一个容器类 工具集,比如列表、优先队列、集合(set)和映射。另外,这些容器是 类型-安全 (type-safe) 的,也就是说,您只能向创建的每一个容器对象中放入一种类型的 元素。这就使得它们的使用更为安全,并避免了 C 所要求的很多冗长的强制类型转 换。并且,STL 包含了很多遍历工具和排序工具,这样就使得容器的使用更为简单 。

Java 编程环境也附带了一组容器类。The java.util 程序包包含 ArrayList、 Ha shMap、TreeSet 以及其他各种标准结构。它还包括有用于对数据进行一般排序、创 建不变集合的工具,以及其他各种便利工具。

不过,C 并没有内置容器支持;您或者只能自己编写,或者使用其他人的数据结构 程序库。

幸运的是,GLib 是一个能够满足此需要的优秀的、免费的、开放源代码的程序库。 它包含了大部分标准数据结构,以及在程序中有效处理数据的很多实用工具。它诞 生于 1996 年,从而经过了彻底地测试,并在发展过程中增加了很多实用功能。

100 字以内(或者更少)的算法分析

对容器的不同操作需要不同长度的时间。例如,在一个长的列表中,访问第一个元 素要快于对同一列表进行排序。用来描述完成这些操作所需时间的符号称为 O-not ation。这个话题需要计算机科学专业的学生用一个学期的时间去研究,但是,简要 地讲,O-notation 是对操作的最坏情况的分析。换句话说,它对完成某个操作所需 要的 最长 时间进行度量。它被证明是度量数据结构操作的有效途径,因为经常会 遇到最坏情况的操作(比如当您搜索某个列表而却没有找到所找查找的条目时)。

接下来论述了一些 O-notation 示例,可以将一副扑克牌在桌子上排列一行:

* O(1) —— 选择第一张牌。 O(1) 也称为“线性时间(constant time)”, 因为不管在列表中有多少张牌,取得第一张牌的时间都是相同的。

* O(n) —— 翻转每一张牌。O(n) 被称为“线性时间(linear time)”,因 为随着牌的数目增加,完成操作所需时间线性增加。

* O(n!) —— 创建一个全部扑克牌所有可能排列的列表。每向列表添加一张新 牌,排列的数目都会阶乘式增加。

您会发现,在整个教程都提及关于不同数据结构操作的 O-notation。了解特定数据 结构上特定操作的开销,能够帮助您更明智地选择容器在,最优化应用程序的性能。

编译 GLib 程序

如果在研究那些示例时编译并运行它们,那么您将通过本文学到更多。由于它们要 使用 GLib,所以编译器需要知道 GLib 头文件和程序库在哪里,以使其能够解析 GLib 定义的类型。这个简单的程序初始化一个双向链表并向其中添加一个字符串:

代码:

//ex-compile.c

#include glib.h

int main(int argc, char** argv) {

GList* list = NULL;

list = g_list_append(list, "Hello world!");

g_printf("The first item is '%s'\n", g_list_first(list)-data);

return 0;

}

可以通过调用 GCC 来编译这个程序,如下:

代码:

$ gcc -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -lglib-2.0 -o ex-compile ex-compile.c

运行它,查看期望的输出:

代码:

$ ./ex-compile

The first item is 'Hello world!'

$

不过,那是一个非常难用的 GCC 调用。更简单的方式是让 GCC 指向 GLib 程序库 。

使用 pkg-config

手工指定程序库的位置容易出错而且很冗长,所以大部分现代的 Linux 发行版本都 附带了 pkgconfig 工具来帮助简化此问题。可以使用 pkgconfig 来编译上面的程 序,如下:

代码:

$ gcc `pkg-config --cflags --libs glib-2.0` -o ex-compile ex-compile.c

输出与先前相同:

代码:

$ ./ex-compile

The first item is 'Hello world!'

$

注意,现在不必再指定 GLib 头文件的路径;pkgconfig 的 --cflags 选项会完成 此任务。使用 --libs 选项指定的程序库也是如此。当然,没有任何神密之处;pk gconfig 只是通过一个配置文件读取出程序库和头文件的位置。在 Fedora Core 3 系统中,pkgconfig 文件位于 /usr/lib/pkgconfig 目录下, glib-2.0.pc 文件 类似如下:

代码:

$ cat /usr/lib/pkgconfig/glib-2.0.pc

prefix=/usr

exec_prefix=/usr

libdir=/usr/lib

includedir=/usr/include

glib_genmarshal=glib-genmarshal

gobject_query=gobject-query

glib_mkenums=glib-mkenums

Name: GLib

Description: C Utility Library

Version: 2.4.7

Libs: -L${libdir} -lglib-2.0

Cflags: -I${includedir}/glib-2.0 -I${libdir}/glib-2.0/include

这样,所有信息都由一个中间层隐藏起来。如果恰巧使用了一个不支持 pkgconfig 的 Linux 发行版本,那么随时可以重新直接为 GCC 指定头文件和程序库。

GLib 的现实应用

仅仅列举出 GLib 容器并展示示例用法可能还不够,所以本教程还包含了 GLib 在 一些开放源代码的应用程序中的现实应用:

* Gaim 是一款流行的实时消息客户机,它在 SourceForge 上的下载次数每个 月都会超过二十五次。

* GIMP(Graphical Image Manipulation Program)是 GLib 本身的出发点( starting point);它是一款广为应用的图像处理程序,从 1996 年开始一直得到 公众的共同开发。

* Evolution 是一款极好的个人信息管理器(PIM),可以追踪电子邮件、联系 人、任务和约会。

研究 GLib 在这些流行的应用程序中的应用还会让您有机会了解一些编码习惯;不 仅能知道函数的名字是什么,您还能够了解通常如何使用它们。您将会熟悉将要使 用的容器,而且甚至会注意到在某些情况下有人选择了并不最适于某任务的容器。

GLib 还拥有很多约定(conventions)及工具宏。在学习本教程的过程中,您将发 现使用并解释了其中的很多。不必尝试一开始就将它们完全记住,而只需要在进行 过程中去学习它们,在示例中去了解它们。

CentOS安装glib和audacious的问题

把原来的glib卸载掉 再编译安装新的 或者 编译新的glib指定目录到/usr/local/glib2

然后在编译audacious 加入 --with选项 把glib的路径指向你编译的目录(具体选项写法参照configure --help所写)

它提示你glib版本必须大于2.28

但是 你本机安装的2.22.5

你编译安装的并没有被识别

所以报错还是原来的glib

glib源代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于glibc源码、glib源代码的信息别忘了在本站进行查找喔。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://www.ahzz.com.cn/post/739.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载