跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表

目录

  1. 理清 GCC、glibc 与 libstdc++ 的关系
  2. libc 与 glibc
  3. eglibc
  4. glib
  5. libstdc++ 与 libc++
  6. 编译流程
  7. gcc 与 g++ 的区别
  8. 版本升级指南
  • 💰 8折买阿里云服务器限时8折了解详情
C++

理清 GCC、glibc 与 libstdc++ 的关系

Linux 环境下 C/C++ 开发常遇到编译链接错误,梳理了 libc、glibc、eglibc、glib、libstdc++ 等标准库的区别与联系,解释 gcc 与 g++ 在编译过程中的角色差异,以及它们如何与系统调用和内核交互,帮助开发者理解底层依赖关系以避免误操作导致系统崩溃。

接口猎人发布于 2019/4/100 浏览
理清 GCC、glibc 与 libstdc++ 的关系

理清 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 为例:

  1. .c 文件通过 gcc 转化为汇编 .S 文件。
  2. 汇编器 as 将 .S 转化为机器码 .o 文件。
  3. 生成的 .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++:

  1. 添加 PPA:
    sudo add-apt-repository ppa:ubuntu-toolchain-r/test
    sudo apt-get update
    
  2. 安装新版:
    sudo apt-get install gcc-4.8
    sudo apt-get install g++-4.8
    
  • 💰 8折买阿里云服务器限时8折购买
  • 🦞 5分钟部署阿里云小龙虾了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog

更多推荐文章

查看全部
  • Apache Airflow 源码分析:启动机制
  • React JSX 基础:组件与 HTML 元素区分原则
  • ASP.NET 公司 Web 服务部署与调试实践
  • 常用英文符号与含义对照表

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online

  • 配置系统默认版本:
    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.6
    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 80 --slave /usr/bin/g++ g++ /usr/bin/g++-4.8
    sudo update-alternatives --config gcc
    
    数字优先级高的会被选为默认编译器,也可手动配置选择所需版本。
  • 注意:更换或升级 glibc/eglibc 影响巨大,ls、cd、mv 等系统命令均依赖它,误操作可能导致系统无法启动,强烈不建议随意更换。