glibc,libc,glib简介

本文介绍了glibc作为Linux中最底层API的重要作用及其提供的多种功能服务,并对比了libc、glibc与glib的区别,详细解释了glib在跨平台应用中的特点及如何使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文来自百度,做一个总结笔记录:

一、glibc简介

glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现

主要的如下:

(1)string,字符串处理

(2)signal,信号处理

(3)dlfcn,管理共享库的动态加载

(4)direct,文件目录操作

(5)elf,共享库的动态加载器,也即interpreter

(6)iconv,不同字符集的编码转换

(7)inet,socket接口的实现

(8)intl,国际化,也即gettext的实现

(9)io

(10)linuxthreads

(11)locale,本地化

(12)login,虚拟终端设备的管理,及系统的安全访问

(13)malloc,动态内存的分配与管理

(14)nis

(15)stdlib,其它基本功能

二、libc、glibc和glib的关系

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

libc主要包括:

  1. <ctype.h>:包含用来测试某个特征字符的函数的函数原型,以及用来转换大小写字母的函数原型;

  2. <errno.h>:定义用来报告错误条件的宏;

  3. <float.h>:包含系统的浮点数大小限制;

  4. <math.h>:包含数学库函数的函数原型;

  5. <stddef.h>:包含执行某些计算 C 所用的常见的函数定义;

  6. <stdio.h>:包含标准输入输出库函数的函数原型,以及他们所用的信息;

  7. <stdlib.h>:包含数字转换到文本,以及文本转换到数字的函数原型,还有内存分配、随机数字以及其他实用函数的函数原型;

  8. <string.h>:包含字符串处理函数的函数原型;

  9. <time.h>:包含时间和日期操作的函数原型和类型;

  10. <stdarg.h>:包含函数原型和宏,用于处理未知数值和类型的函数的参数列表;

  11. <signal.h>:包含函数原型和宏,用于处理程序执行期间可能出现的各种条件;

  12. <setjmp.h>:包含可以绕过一般函数调用并返回序列的函数的原型,即非局部跳转;

  13. <locale.h>:包含函数原型和其他信息,使程序可以针对所运行的地区进行修改。

  14. 地区的表示方法可以使计算机系统处理不同的数据表达约定,如全世界的日期、时间、美元数和大数字;

  15. <assert.h>:包含宏和信息,用于进行诊断,帮助程序调试。

Linux下面的标准c库不仅有这一个,如uclibc、klibc,以及上面被提到的Linux libc,但是glibc无疑是用得最多的。glibc在/lib目录下的.so文件为libc.so.6

glib库是Linux平台下最常用的C语言函数库,它具有很好的可移植性和实用性

三、glib简介

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

如果在程序中要使用到glib库中的函数,则应该包含glib.h头文件(在gtk.h和gnome.h头文件中已经包含了glib.h了)

从下面的代码部分可以看到,都以g打头或者g_打头的都是glib的东西

3.1类型定义

1. 整数类型:gint8、guint8、gint16、guint16、gint32、guint32、gint64、guint64。不是所有的平台都提供64位整型

2. 整数类型gshort、glong、gint和short、long、int相同

3. 布尔类型gboolean:gboolean可以取两个值:TRUE和FALSE

4. 字符型gchar和char相同

5. 浮点型gfloat和gdouble和float、double完全等价

6. 指针gpointer对应于标准C的void*

7. gconstpointer对于于标准C的const void*

3.2内存管理

1. g_malloc总是返回gpointer类型。如果申请失败,g_malloc将退出程序,所以不用检查返回值

2. g_free忽略任何传递给它的NULL指针

3. g_realloc函数和realloc函数功能相同

4. g_malloc0:将分配的内存的每一个单元都置0

5.字符串处理

3.3数据结构

1 链表

glib提供了普通的单向链表和双向链表,分别是GSList和GList。链表中的数据域是一个gpointer类型(通过GINT_TO_POINTER转换也可以使得链表中可以保存整型)。

  • g_list_pervious用在双向链表中来查找指定元素的前一个元素,该函数为双向链表中独有的函数。

  • 注:这里只讲单向链表函数,其它双向链表函数只需要将单向链表函数名改为“g_list_名称”即可,也适用。

  • g_slist_append用来在单向链表中添加一个元素

  • g_slist_remove用来在单向链表中删除一个元素

  • g_slist_next用来获取指定元素的下一个元素

  • g_slist_prepend用来在链表表头插入数据

  • g_slist_reverse用来将链表中的元素反置

  • g_slist_insert用来在指定位置插入一个元素

  • g_slist_remove用来在删除指定的元素

  • g_slist_foreach对链表的每一项调用GFunc函数。GFunc函数的定义如下:void* GFunc(gpointer data,gpointer user_data)

2 树

在glib中有两种不同的树:GTree是基本的平衡二叉树,它将存储的数据按其值排序成二叉排序树

3 哈希表

3.4 GString

GString类似于标准C的字符串类型,但是GString能够自动增长,这些特性可以防止程序中的缓冲区溢出。下面是GString的定义:

struct GString{

gchar* str; 指向字符串数据的存储空间

gint len; 字符串的长度

}

1. g_string_new(gchar* init):使用一个字符串来创建一个GString结构

2. g_string_free(GString* string,gint free_segment):释放GString所占的内存

3. g_string_assign(GString* lval,const gchar* rval):将字符串rval复制到lval,销毁lval原有的内容

4. g_string_truncate:截取字符串来生成指定长度的字符串

5. g_string_append:将字符串追加到指定字符串后面

6. g_string_append_c:将字符追加到指定的字符串后面

7. g_string_prepend:将字符串追加到指定的字符串前面

8. g_string_prepend_c:将字符追加到指定的字符串前面

9. g_string_sprintf:将一个格式化字符串写入到GString中

3.5 glib使用

gcc pkg-config --cflags --libs glib-2.0 hello.c -o hello

### 如何进行 Glibc 升级 #### 1. 准备工作 在升级 Glibc 前,需确认当前系统的环境配置以及现有版本的信息。可以通过以下命令检查当前系统上已安装的 Glibc 版本: ```bash ldd --version ``` 此命令会显示类似于 `GNU libc` 的版本号[^2]。 #### 2. 下载目标版本的 Glibc 源码包 访问官方资源站点下载所需的 Glibc 版本源码文件。例如,在 Node.js 非正式构建页面中可能找到相关依赖信息[^1]。通常情况下,推荐从 GNU 官方网站获取最新的稳定版 Glibc 源码压缩包。 #### 3. 编译并安装新版本 Glibc 以下是基于 CentOS 系统的一般流程: - **解压源码** 将下载好的 tarball 文件解压到指定目录下。 ```bash tar -xvf glibc-<version>.tar.gz cd glibc-<version> ``` - **创建编译目录** 不建议直接在源代码根目录内完成整个构建过程,因此先新建一个子文件夹用于存放生成物。 ```bash mkdir build && cd build ``` - **运行配置脚本** 使用 `../configure` 脚本来初始化项目设置,并指明最终安装路径(如 `/opt/glibc-new-version`)。注意确保 `$PATH` 中存在可用的 C 编译器;如果没有,则需要先行安装 GCC 工具链。 ```bash ../configure --prefix=/opt/glibc-new-version ``` 如果遇到缺少必要工具的情况,请参照提示补充相应 RPM 包管理器组件[^4]。 - **启动实际编译环节** 利用多线程加速方式加快进程速度(假设 CPU 支持四个逻辑核心)。 ```bash make -j4 ``` - **部署成果** 创建必要的链接结构以便后续加载动态共享对象时能够正常定位到新的库位置。 ```bash sudo mkdir -p /opt/glibc-new-version/etc/ sudo cp -r /etc/ld.so.conf* /opt/glibc-new-version/etc/ sudo make install ``` #### 4. 测试与验证 为了保证替换后的功能一致性,可尝试执行简单的程序调用来测试新版 Glibc 是否生效。 ```bash /opt/glibc-new-version/bin/ldd --version ``` 如果输出结果显示的是预期的新版本号,则说明更新成功[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值