理清 GCC、glibc 与 libstdc++ 的关系
在 Linux 下编写 C/C++ 代码时,时常遇到 glibc、gcc、g++ 等相关错误,有时无从下手。本文旨在理清编译链接过程中涉及的概念,尤其是 libc、glibc、eglibc、libc++、libstdc++、gcc、g++ 之间的关系。
libc 与 glibc
libc 是 Linux 下原来的标准 C 库,即 #include <stdio.h> 定义的地方。后来逐渐被 glibc(GNU C Library)取代。在此之前还有 klibc、uclibc,现在主流 Linux 操作系统如 Debian、Ubuntu、Redhat 等均使用 glibc 或其变种。
glibc 是 Linux 系统中最底层的 API,几乎所有运行库都要依赖它。其主要功能是对系统调用的封装。例如在 C 代码中使用 fopen 打开文件,最终触发 sys_open 系统调用,中间处理由 glibc 完成。除了封装系统调用,glibc 还提供 string、malloc、stdlib、linuxthreads、locale、signal 等功能。
eglibc
eglibc 是 glibc 的嵌入式变种(Embedded),为了更好支持嵌入式架构,兼容不同 shell。它是二进制兼容 glibc 的,替换后通常无需重新编译。Ubuntu 系统曾使用 eglibc。可通过 ldd --version 或查看 /lib/i386-linux-gnu/libc.so.6(64 位为 /lib/x86_64-linux-gnu)确认版本信息。libc.so.6 即为编译后的库文件。
glib
glib 也是一个 C 程序库,但较轻量级。它将 C 语言数据类型统一封装,提供常用数据结构定义及处理函数、宏及可移植封装。glib 可在 Linux 或 Windows 下使用。它与 glibc 无直接关系,除非程序显式引用。Ubuntu 不默认安装 glib,需手动安装 libglib2.0-dev。GTK+ 和 Gnome 底层使用 glib。
libstdc++ 与 libc++
若编写 C++ 代码,需注意 libc++ 和 libstdc++。两者均为 C++ 标准库。libc++ 针对 clang 编译器重写,libstdc++ 则属于 gcc。libstdc++ 与 gcc 捆绑安装。
libstdc++ 虽提供 C++ 标准库,但不直接与内核打交道。系统级事件中,libstdc++ 先与 glibc 交互才能与内核通信,因此相比 glibc 没那么基础。
编译流程
所有库最终需与程序链接。以 gcc 为例:
.c文件通过 gcc 转化为汇编.S文件。- 汇编器 as 将
.S转化为机器码.o文件。 - 生成的
.o文件与其他.o文件或libc.so.6等库通过 ld 链接器生成可执行文件。
gcc 与 g++ 的区别
g++ 不仅用于 C++,后缀为 .c 时,gcc 视为 C 程序,g++ 视为 C++ 程序;后缀为 .cpp 时,两者均视为 C++ 程序。虽然 C++ 是 C 的超集,但语法要求有别。编译阶段 g++ 会调用 gcc。对于 C++ 代码,两者等价,但 gcc 不能自动链接 C++ 库,需手动加 -lstdc++。若 Makefile 未添加,通常会提示错误并要求安装 g++。
版本升级指南
若编译器不支持新特性,可基于 Ubuntu 升级 gcc/g++:
- 添加 PPA:
sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt-get update - 安装新版:
sudo apt-get install gcc-4.8 sudo apt-get install g++-4.8

