当前位置: 首页 > 工具软件 > uClibc > 使用案例 >

C 函数库 ——libc,glibc,eglibc,uClibc,newlib

勾通
2023-12-01

glibc

glibc和libc都是Linux下的C函数库,libc是Linux下的ANSI C的函数库;glibc是Linux下的GUN C的函数库;GNU C是一种ANSI C的扩展实现。ANSI C是基本的C语言函数库,包含了C语言最基本的库函数。这个库可以根据 头文件划分为 15 个部分,其中包括:

<asset.h>,<ctype.h>,<errno.h>,<float.h>,<limits.h>,<locale.h>,<math.h>,<setjmp.h> ,<signal.h>,<stdarg.h>,<stddef.h>,<stdlib.h>,<stdio.h>,<string.h>,<time.h>

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

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

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

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

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

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

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

字符串操作 (<string.h>)、:包含字符串处理函数的函数原型;

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

可变参数表 (<stdarg.h>):定义宏,用于处理未知数值和类型的函数的参数列表;

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

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

本地信息 (<locale.h>):包含函数原型和其他信息,使程序可以针对所运行的地区进行修改。地区的表示方法可以使计算机系统处理不同的数据表达约定,如全世界的日期、时间、美元数和大数字

程序断言 (<assert.h>) :包含宏和信息,用于进行诊断,帮助程序调试。这在其他的C语言的IDE中都是有的。

uClibc

uClibc 是一个面向嵌入式Linux系统的小型的C标准库。最初uClibc是为了支持uClinux而开发,这是一个不需要内存管理单元(MMU)的Linux版本。uClibc比一般用于Linux发行版的C库GNU C Library (glibc)要小得多, uClibc专注于嵌入式Linux。很多功能可以根据空间需求进行取舍。

Newlib

Newlib是一个面向嵌入式系统的C运行库。最初是由Cygnus Solutions收集组装的一个源代码集合,取名为newlib,现在由Red Hat维护,目前的最新的版本是2.1.0。对于与GNU兼容的嵌入式C运行库,Newlib并不是唯一的选择,但是从成熟度来讲,newlib是最优秀的。newlib可移植性强,具有可重入特性、功能完备等特点,已广泛应用于各种嵌入式系统中。Cygwin目前使用Newlib来作为它的C标准库。

其它

1.Glibc
glibc = GNU C Library
是GNU项(GNU Project)目,所实现的 C语言标准库(C standard library)。
目前,常见的桌面和服务器中的GNU/Linux类的系统中,都是用的这套C语言标准库。
其实现了常见的C库的函数,支持很多种系统平台,功能很全,但是也相对比较臃肿和庞大。

2.uClibc
一个小型的C语言标准库,主要用于嵌入式。
其最开始设计用于uClinux(注:uClinux不支持MMU),因此比较适用于微处理器中。
对应的,此处的u意思是μ,Micro,微小的意思。

uClibc的特点:
(1)uClibc比glibc要小很多。
(2)uClibc是独立的,为了应用于嵌入式系统中,完全重新实现出来的。和glibc在源码结构和二进制上,都不兼容。

3.EGLIBC
EGLIBC = Embedded GLIBC
EGLIBC是,(后来)glibc的原创作组织FSF所(新)推出的,glibc的一种变体,目的在于将glibc用于嵌入式系统。
EGLIBC的目标是:
(1)保持源码和二进制级别的兼容于Glibc
源代码架构和ABI层面兼容
如果真正实现了这个目标,那意味着,你之前用glibc编译的程序,可以直接用eglibc替换,而不需要重新编译。
这样就可以复用之前的很多的程序了。
(2)降低(内存)资源占用/消耗
(3)使更多的模块为可配置的(以实现按需裁剪不需要的模块)
(4)提高对于交叉编译(cross-compilation)和交叉测试(cross-testing)的支持

Eglibc的最主要特点就是可配置,这样对于嵌入式系统中,你所不需要的模块,比如NIS,locale等,就可以裁剪掉,不把其编译到库中,使得降低生成的库的大小了。

【glibc, uClibc, Elibc的渊源/历史/区别/联系】

  1. 写程序,需要用到很多c语言的库函数。所有的库函数加起来,就是对应的C语言(标准)函数库。
  2. 目前在普通GNU/Linux系统中所用的C语言标准库,叫做glibc。其功能很全,函数很多,但是代码太多,编译出来的函数库的大小也很大,即资源占用也很多。
  3. 而嵌入式系统中,也需要C语言写代码实现特定功能,也需要用到C语言函数库,但是由于嵌入式系统中,一般资源比较有限,所以不适合直接使用(太占用资源的)gLibc。
  4. 所以有人就又(没有参考glibc,而是从头开始,)重新实现了一个用于嵌入式系统中的,代码量不是很大的,资源占用相对较少的,C语言函数库,叫做uClibc。并且,uClibc不支持MMU(内存管理单元)。
  5. 而后来,glibc的开发者,又推出个Embedded glibc,简称eglibc,其主要目的也是将glibc用于嵌入式领域。
    相应最大的改动就在于,把更多的库函数,改为可配置的,这样,如果你的嵌入式系统中不需要某些函数,就可以裁剪掉,不把该函数编译到你的eglibc库中,使得最终生成的eglibc库的大小变小,最终符合你的嵌入式系统的要求(不能超过一定的大小),这样,就实现了,把glibc引用于嵌入式系统中的目的了。

可以简单的理解为:
glibc,uClibc,eglibc都是C语言函数库:
6. uClibc是嵌入式系统中用的,glibc是桌面系统用的
7. eglibc也是嵌入式系统中用的,是glibc的嵌入式版本,和glibc在源码和二进制上兼容。

转自:https://www.cnblogs.com/dpc525/p/5211306.html,https://blog.csdn.net/hemmingway/article/details/38870811

 类似资料: