标准库是由编程语言规范定义的一组函数和工具集合,提供了常用的基础功能,如输入输出、字符串操作、内存管理、数学计算和时间处理等。它使得开发者能够避免重复造轮子,直接使用已经实现好的通用功能,以提高开发效率并确保代码的兼容性和稳定性。下面主要介绍一些主流的标准库。

比较表

名称 适用场景 体积 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 服务器、桌面开发 glibcmuslFreeBSD libc
嵌入式系统、低功耗设备 musluClibcNewlib
Android 应用开发 Bionic
macOS/iOS 开发 Apple libc
轻量级 Docker 容器 muslDiet libc
裸机编程(无 OS) Newlib
最小化 Linux 发行版 muslDiet 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 宏,EACCESENOMEM
信号处理 <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。
    优点
  1. 小巧高效:musl 设计目标是尽可能小且高效,适合资源受限的环境。
  2. 与 glibc 兼容:musl 提供大部分标准的 POSIX 和 C 标准库功能,适用于大多数常见的 Linux 应用。
  3. 无依赖性:musl 没有复杂的外部依赖,简化了构建和部署过程。
  4. 适用于嵌入式和容器:非常适合嵌入式系统、Docker 容器等轻量级环境。
    不足
  5. 不完全兼容 GNU 扩展:musl 实现的是标准 POSIX 和 ISO C,但不包括 glibc 的一些扩展和特性(如线程本地存储(TLS)扩展)。
  6. 不完全兼容某些旧的应用程序:由于缺少某些特性,某些基于 glibc 的旧应用程序可能不兼容 musl。
  7. 社区支持较小:尽管 musl 有着积极的社区支持,但与 glibc 相比,它的社区和文档支持较少,用户数量和生态系统较小。

他适合的场景是: 嵌入式系统、Docker 容器、RTOS、轻量级 linux

uClibc

uClibc 是另一个轻量级的 C 标准库实现,专门为嵌入式系统设计,尤其是那些资源有限、需要小型、快速和低内存消耗的系统。与 glibc 不同,uClibc 旨在提供更小的二进制文件,并且可以在 无内存管理单元(MMU)嵌入式设备中运行。
其特点有:小巧高效、兼容性、高度定制化。
但其带来的缺点有:缺少某些 GNU 扩展、线程功能不足、浮点运算不完全支持
适用于嵌入式系统、Docker 容器、RTOS、轻量级 linux

Bionic

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 libcFreeBSD 操作系统 提供的 C 标准库实现,它基于 BSD 传统的 libc,并针对现代 UNIX-like 操作系统进行了优化。

    Cosmopolitan

    Cosmopolitan libc(简称 cosmo)是一个革命性的 跨平台 C 标准库实现,它的设计目标是让 C 语言代码可以编译成 通用的二进制文件,可以在 Linux、macOS、Windows、FreeBSD 和其他 POSIX 兼容系统上运行 而无需重新编译

参考文献