标准库——LLVM libc的衍生与同行
标准库是由编程语言规范定义的一组函数和工具集合,提供了常用的基础功能,如输入输出、字符串操作、内存管理、数学计算和时间处理等。它使得开发者能够避免重复造轮子,直接使用已经实现好的通用功能,以提高开发效率并确保代码的兼容性和稳定性。下面主要介绍一些主流的标准库。
比较表
名称 | 适用场景 | 体积 | POSIX 兼容性 | 线程支持 | 动态链接 | 跨平台支持 | 主要优势 | 主要劣势 |
---|---|---|---|---|---|---|---|---|
glibc | 通用 Linux 系统,桌面和服务器 | 较大 | 完整支持 | 强大 | 支持 | Linux, BSD | 最完整的 C 库,功能最全 | 体积庞大,占用较多资源 |
musl | 轻量级 Linux 发行版,容器环境 | 小 | 完整支持 | 完整支持 | 支持 | Linux | 轻量高效,适合容器和嵌入式 | GNU 扩展支持较少 |
uClibc | 嵌入式 Linux,低功耗设备 | 小 | 部分支持 | 基础支持 | 支持 | Linux | 适合无 MMU 设备 | 功能较弱,缺少部分 GNU 扩展 |
Bionic | Android 操作系统 | 中等 | 部分支持 | 完整支持 | 支持 | Android | 优化移动端,支持 GCD | 不适用于其他 Unix-like 系统 |
Newlib | 嵌入式系统,RTOS,裸机编程 | 极小 | 部分支持 | 弱 | ==不支持== | 多种架构 | 极轻量,适合裸机和 RTOS | POSIX 兼容性低 |
Diet libc | 资源极限系统,微型 Linux | 极小 | 基本支持 | 弱 | 支持 | Linux | 极小体积,极端优化 | 不支持复杂 POSIX 线程 |
Apple libc | macOS, iOS, watchOS, tvOS | 中等 | 部分支持 | 强大 | 支持 | Apple 生态 | 整合 libSystem,优化 GCD | 仅适用于 Apple 设备 |
FreeBSD libc | FreeBSD, NetBSD, OpenBSD | 适中 | ==完整支持== | 完整支持 | 支持 | BSD 生态 | 高兼容性,适合服务器和安全应用 | 不适用于 Linux |
Cosmopolitan | 跨平台应用,便携式工具 | 极小 | 基本支持 | 未知 | 不依赖 | Windows, Linux, macOS, BSD | 支持 “Just One Binary” | POSIX 兼容性较低 |
总结分类
1️⃣ 通用 C 标准库(完整功能)
这些 C 库提供 完整的 POSIX 兼容性,并适用于 桌面和服务器端的通用 Linux 系统。它们支持完整的线程模型、多种 I/O 操作以及动态链接:
- glibc:最广泛使用的 C 库,功能最全,但体积较大,适合 桌面和服务器。
- FreeBSD libc:适用于 BSD 系列操作系统,兼容性强,安全性高。
- **Apple libc (libSyste
2️⃣ 轻量级 C 标准库(适合嵌入式和容器化)
这些 C 库适用于 资源受限的设备,如嵌入式系统、Docker 容器等,它们的目标是减少二进制体积,同时仍然提供合理的 POSIX 兼容性: - musl:轻量级但功能完整,适用于 容器化环境、Alpine Linux。
- uClibc:主要用于嵌入式设备,适合 无 MMU 设备,但不支持完整的 POSIX 线程。
- Bionic:专为 Android 设计,优化了移动设备,集成 GCD 和线程调度。
3️⃣ 极限优化的 C 库(超小体积)
这些库的目标是 极限优化,适用于存储和内存受限的系统,如微型 Linux 发行版、裸机编程(bare-metal)或极小型容器: - Newlib:专为 嵌入式系统 和 RTOS 设计,没有完整的 POSIX 兼容性。
- Diet libc:超小体积,适用于微型 Linux 系统和极限优化场景,但 不支持完整的 POSIX 线程。
- Cosmopolitan:支持 单个二进制文件跨平台运行(Windows、Linux、macOS、BSD),但 POSIX 兼容性较低。
快速参考
哪个 C 库适合你的项目?
需求 | 推荐 C 库 |
---|---|
Linux 服务器、桌面开发 | glibc 、musl 、FreeBSD libc |
嵌入式系统、低功耗设备 | musl 、uClibc 、Newlib |
Android 应用开发 | Bionic |
macOS/iOS 开发 | Apple libc |
轻量级 Docker 容器 | musl 、Diet libc |
裸机编程(无 OS) | Newlib |
最小化 Linux 发行版 | musl 、Diet libc |
便携式跨平台 CLI 工具 | Cosmopolitan |
详细介绍
glibc
glibc(GNU C Library)是 GNU 项目提供的 C 标准库实现,广泛用于 Linux 系统。它全面支持 ISO C 标准和 POSIX 规范,同时提供了许多 GNU 扩展功能,如动态内存管理、线程支持、多种国际化工具和动态链接器(ld-linux.so)。glibc 针对不同硬件架构(如 x86、ARM、RISC-V)进行了高度优化,是 Linux 桌面、服务器和高性能计算中最常用的 C 标准库实现。
以下是 glibc 的速查表(一部分):
类别 | 头文件 | 功能 | 常用函数/宏 |
---|---|---|---|
输入输出 | <stdio.h> |
标准输入输出 | printf() 、scanf() 、fgets() |
字符串操作 | <string.h> |
字符串和内存操作 | strlen() 、strcpy() 、strcmp() |
动态内存管理 | <stdlib.h> |
动态内存分配 | malloc() 、calloc() 、free() |
数学运算 | <math.h> |
基础和高级数学计算 | pow() 、sqrt() 、sin() |
时间和日期 | <time.h> |
时间和日期处理 | time() 、strftime() 、difftime() |
字符处理 | <ctype.h> |
字符类型判断和转换 | isalpha() 、isdigit() 、tolower() |
错误处理 | <errno.h> |
提供错误码和错误处理 | errno 宏,EACCES ,ENOMEM |
信号处理 | <signal.h> |
信号捕获和管理 | signal() 、raise() |
线程支持 | <pthread.h> |
POSIX 线程 | pthread_create() 、pthread_mutex_lock() |
国际化 | <locale.h> |
本地化和国际化支持 | setlocale() 、localeconv() |
动态库加载 | <dlfcn.h> |
动态加载共享库 | dlopen() 、dlsym() |
GNU 扩展 | <execinfo.h> |
栈跟踪、参数解析、加密等 | backtrace() 、argp_parse() |
其他库还有:
- 线程和并发支持:
pthread.h
:提供 POSIX 线程(pthread)接口,支持多线程程序的创建和同步。 - 内存池和共享内存:
<sys/mman.h>
:提供内存映射、共享内存和内存池的功能。 - 文件操作:
<fcntl.h>
:提供文件描述符操作函数,如文件控制和文件锁定。 - 系统调用和系统接口:
<sys/types.h>
,<sys/stat.h>
,<sys/socket.h>
:提供系统调用封装,支持文件系统、进程控制和网络通信。 - 信号和异常处理:
<signal.h>
:处理异步信号,设置信号处理程序。 - 异常处理:
<setjmp.h>
- 网络编程:
<arpa/inet.h>
,<netinet/in.h>
(SPEC06 就有前者) - 加密与安全:
<crypt.h>
其他扩展模块就不一一列举了,查询可以参考 GNU C Lib Manual,可以查看网页版或者下载 pdf 等等。musl
musl 是一个 轻量级的 C 标准库实现,旨在为==嵌入式系统、资源受限环境和其他要求高效、紧凑的系统提供支持==。musl 兼容标准的 C 和 POSIX 规范,但其设计目标是 减少内存占用、提高性能、并保持简单性。
主要特点是轻量和小巧、标准兼容、可移植性、与glibc
兼容的 API。
优点:
- 小巧高效:musl 设计目标是尽可能小且高效,适合资源受限的环境。
- 与 glibc 兼容:musl 提供大部分标准的 POSIX 和 C 标准库功能,适用于大多数常见的 Linux 应用。
- 无依赖性:musl 没有复杂的外部依赖,简化了构建和部署过程。
- 适用于嵌入式和容器:非常适合嵌入式系统、Docker 容器等轻量级环境。
不足: - 不完全兼容 GNU 扩展:musl 实现的是标准 POSIX 和 ISO C,但不包括
glibc
的一些扩展和特性(如线程本地存储(TLS)扩展)。 - 不完全兼容某些旧的应用程序:由于缺少某些特性,某些基于
glibc
的旧应用程序可能不兼容 musl。 - 社区支持较小:尽管 musl 有着积极的社区支持,但与 glibc 相比,它的社区和文档支持较少,用户数量和生态系统较小。
他适合的场景是: 嵌入式系统、Docker 容器、RTOS、轻量级 linux
uClibc
uClibc 是另一个轻量级的 C 标准库实现,专门为嵌入式系统设计,尤其是那些资源有限、需要小型、快速和低内存消耗的系统。与
glibc
不同,uClibc
旨在提供更小的二进制文件,并且可以在 无内存管理单元(MMU) 或嵌入式设备中运行。
其特点有:小巧高效、兼容性、高度定制化。
但其带来的缺点有:缺少某些 GNU 扩展、线程功能不足、浮点运算不完全支持
适用于嵌入式系统、Docker 容器、RTOS、轻量级 linuxBionic
Bionic libc 是 Google 为 ==Android 操作系统==开发的 C 标准库实现,旨在为 Android 系统提供高效、轻量级且优化的 C 语言运行时支持。它被设计为一个 嵌入式和移动平台的 libc 实现,并且与 Android 的 Linux 内核紧密集成。Bionic 是专为 Android 开发和优化的 C 标准库,支持 Android 的各类硬件和软件要求。
既然是移动端的 C 库,那么就会有轻量高效的特点,但是不足之处为与glibc
兼容性差、功能简化于社区支持。Newlib
Newlib 是一个用于==嵌入式系统==的 C 标准库 实现,它专门为没有操作系统的系统或资源受限的环境设计。Newlib 提供了 ISO C 标准和 POSIX 标准的一些功能接口,特别适合嵌入式开发环境,如实时操作系统(RTOS)和裸机(bare-metal)系统。它为嵌入式开发者提供了一个可靠且高效的标准库,同时支持多种硬件平台。
但是缺点同样是简化的多线程功能,适用于裸机编程 (bare-metal)Diet libc
Diet libc 是一个极其轻量的 C 标准库实现,专为嵌入式系统、微型操作系统以及资源受限的环境设计。它的目标是提供一个非常小巧且高效的替代方案,以支持基于 Linux 或类似 UNIX 系统的应用程序,特别是在内存和存储空间有限的情况下。
同样也适用于裸机编程。Apple libc
Apple libc(有时称为 libSystem)是 Apple 为 macOS、iOS、watchOS 和 tvOS 开发的 C 标准库实现。它基于 FreeBSD 的
libc
,但进行了大量定制,以优化 Apple 设备的性能、安全性和可扩展性。
- 在 macOS 和 iOS 上,
libc
并不是一个独立的库,而是包含在libSystem.dylib
中。libSystem.dylib
其实是一个 超级库,包括:
libc.dylib
(标准 C 库)libm.dylib
(数学库)libpthread.dylib
(线程库)libdispatch.dylib
(Grand Central Dispatch 并发编程库)libc++
(C++ 标准库)- 这种 统一集成 使得 Apple 平台上的动态链接更加高效。
FreeBSD
FreeBSD libc 是 FreeBSD 操作系统 提供的 C 标准库实现,它基于 BSD 传统的libc
,并针对现代 UNIX-like 操作系统进行了优化。Cosmopolitan
Cosmopolitan libc(简称cosmo
)是一个革命性的 跨平台 C 标准库实现,它的设计目标是让 C 语言代码可以编译成 通用的二进制文件,可以在 Linux、macOS、Windows、FreeBSD 和其他 POSIX 兼容系统上运行 而无需重新编译。