glibc、libstdc++ 与 libc++ 区别与联系

glibc、libstdc++ 与 libc++ 区别与联系

目录

  1. 概述
  2. [glibc(GNU C Library)](#glibc(GNU C Library))
  3. [libstdc++(GNU C++ 标准库)](#libstdc++(GNU C++ 标准库))
  4. [libc++(LLVM C++ 标准库)](#libc++(LLVM C++ 标准库))
  5. 总结与对比表
  6. 动态库文件名速查
  7. 如何查看与选用
  8. 版本与兼容性
  9. 常见问题与注意
  10. 比喻小结
  11. 免责声明

一、概述

三者分别是:

  • glibc:C 语言标准库在 Linux 上的主要实现,是系统层的基础库。
  • libstdc++:C++ 标准库的 GNU 实现,与 GCC 配套。
  • libc++:C++ 标准库的 LLVM 实现,与 Clang 配套。

适用范围 :本文主要针对 Linux + GCC/Clang 环境。其他系统有所不同:Windows 使用 MSVCRT/UCRT(非 glibc);macOS 使用系统自带的 libc 与 libc++;Linux 上除 glibc 外还有 musl、BSD libc 等 C 库实现,常用于轻量发行版或容器。


二、glibc(GNU C Library)

项目 说明
是什么 C 语言标准库在 Linux 上的主要实现,相当于操作系统提供给 C 程序的基础工具箱。
核心功能 系统调用封装openreadwriteclose 等与内核交互;基础函数printfmalloc/freestrcpysprintf 等;国际化:字符编码、日期格式等。
地位 Linux 基石之一,绝大多数 C 程序以及 Python、Java、Go 等语言的运行时都依赖 glibc。

一句话:glibc 是 Linux 下 C 程序的「地基」和标准工具箱。


三、libstdc++(GNU C++ 标准库)

项目 说明
是什么 C++ 标准库的一个实现,由 GNU 项目维护,是 GCC 编译器套件的一部分。
核心功能 实现 ISO C++ 标准:iostreamstringvectormapalgorithm 等;为异常、RTTI 等提供底层实现。
与编译器关系 与 GCC 紧密集成,用 GCC 编译 C++ 时默认链接 libstdc++。

一句话:libstdc++ 是 GCC 的「C++ 专用高级工具箱」。


四、libc++(LLVM C++ 标准库)

项目 说明
是什么 C++ 标准库的另一种实现,由 LLVM 项目维护,是 Clang 的默认 C++ 标准库。
设计目标 现代化 :围绕 C++11/14/17/20 设计,代码简洁;兼容性 :与 libstdc++ 在 ABI 上兼容(实践中可能有差异);性能:针对 LLVM 后端优化。
与编译器关系 Clang 的「官配」C++ 库;macOS 系统自带 C++ 库即为 libc++。

一句话:libc++ 是 LLVM/Clang 的「现代化、高性能 C++ 专用高级工具箱」。


五、总结与对比表

特性 glibc libstdc++ libc++
语言 C 语言 C++ 语言 C++ 语言
角色 C 标准库实现 C++ 标准库实现(GNU 版) C++ 标准库实现(LLVM 版)
主要维护者 GNU Project GNU Project LLVM Project
关联编译器 GCC 及其他 GCC Clang
核心功能 系统调用、内存管理、字符串、文件 I/O 等 STL 容器、算法、IO 流、智能指针等 STL 容器、算法、IO 流、智能指针等
依赖关系 独立,是底层基础 依赖 glibc(自身用 C/C++ 编写) 依赖 libc,通常也依赖 glibc

六、动态库文件名速查

在系统中排查或确认程序实际链接的库时,可对照以下常见文件名(Linux 为例):

常见动态库文件名 说明
glibc libc.so.6 主 C 库;有时还有 libpthread.so.0(线程)等。
libstdc++ libstdc++.so.6 GCC 随带的 C++ 标准库。
libc++ libc++.solibc++.so.1 LLVM C++ 标准库。
libc++abi libc++abi.solibc++abi.so.1 libc++ 依赖的 ABI 库(异常、RTTI 等)。

macOS 上常见为 libc++.1.dyliblibc++abi.1.dylib 等。具体以 ldd(Linux)或 otool -L(macOS)输出为准。


七、如何查看与选用

7.1 如何查看程序依赖了哪些库

  • Linuxldd <可执行文件或 .so> 列出动态依赖;readelf -d <可执行文件> | grep NEEDED 只看 NEEDED 项。
  • macOSotool -L <可执行文件或 .dylib>

7.2 如何显式选择 C++ 标准库

使用 Clang 时,可指定链接哪一套 C++ 标准库;GCC 默认且通常只与 libstdc++ 搭配。

编译器 默认 C++ 标准库 指定 libc++ 指定 libstdc++
GCC libstdc++ 不适用(GCC 不提供 libc++) 默认,无需额外选项
Clang 多数 Linux 上为 libstdc++,macOS 为 libc++ -stdlib=libc++ -stdlib=libstdc++

链接时需与编译时一致(例如都用 -stdlib=libc++),否则可能出现未定义符号或 ABI 不兼容。


八、版本与兼容性

  • glibc :各 Linux 发行版搭载的 glibc 版本不同,二进制会依赖具体符号版本(如 GLIBC_2.34)。在较新系统上编译的程序放到较旧系统上运行,常出现 GLIBC_2.xx not found 类错误,需在旧系统或兼容环境(如容器、chroot)下编译,或使用静态链接/自带 glibc 的方案。
  • libstdc++ / libc++ :对 C++11/14/17/20 等标准的支持与编译器及库版本相关,使用较新标准时需保证 GCC/Clang 与对应标准库版本足够新。具体支持情况见各编译器与发行版文档。

九、常见问题与注意

  • 不要混用两套 C++ 标准库:同一进程内(尤其是动态加载的 .so)不要混合使用用 libstdc++ 编译的库和用 libc++ 编译的库,二者 C++ ABI 可能不兼容,易导致崩溃或未定义行为。可执行文件与所有依赖的 .so 应统一使用同一套(要么全部 libstdc++,要么全部 libc++)。
  • 容器与交叉编译:在容器或交叉编译时,目标环境的 glibc、libstdc++ 版本可能与本机不同,需选择与目标一致或兼容的基础镜像或 sysroot,否则会出现运行时的库或符号版本错误。详见各发行版与镜像文档。

十、比喻小结

  • glibc:相当于土地、地基和基本建材;没有它,C/C++ 程序都搭不起来,是所有程序的基础。
  • libstdc++libc++:相当于两套不同的「精装修工具和家具」------功能都符合 C++ 标准(容器、算法、IO 等),但实现与风格不同。
  • GCC 编译时,默认带 libstdc++ ;用 Clang 编译时,默认带 libc++

十一、免责声明

本文整理自公开技术问答,仅供学习与参考。具体 ABI、版本兼容性以各发行版与官方文档为准。更一般的「运行时库」概念、各平台实现形式及多实例与多版本问题,可参见本目录下其他运行时库相关文档。


参考资料:公开技术问答与 GNU/LLVM 官方说明整理。

相关推荐
2401_844221322 小时前
内存对齐与缓存友好设计
开发语言·c++·算法
qiuyunoqy2 小时前
Linux进程 --- 5(进程地址空间初识)
linux·c++·算法
计算机安禾2 小时前
【C语言程序设计】第28篇:指针的概念与指针变量
c语言·开发语言·数据结构·c++·算法·visual studio code·visual studio
qingy_20462 小时前
Java基础:数据类型
java·开发语言·算法
sycmancia2 小时前
C++——智能指针类模板
开发语言·c++
王夏奇2 小时前
Python-对excel文件操作的总览
开发语言·python·excel
knighthood20012 小时前
ROS1中source xxx.bash失效
开发语言·bash
骇客野人2 小时前
python爬虫例子,且处理反爬的网站也能爬
开发语言·爬虫·python
程序员在线炒粉8元1份顺丰包邮送可乐2 小时前
【Java 实现】用友 BIP V5 版本与飞书集成单点登录(飞书免密登录到用友 ERP)
java·开发语言·飞书·用友 bip