跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++

Linux 环境下 C/C++ 编译流程与链接机制详解

综述由AI生成Linux 环境下 C/C++ 编译涉及 GCC 和 G++ 工具的安装与使用。编译过程分为预处理、编译、汇编和链接四个阶段。静态库在编译时嵌入代码,生成独立可执行文件但体积较大;动态库在运行时加载,节省空间但需依赖外部文件。了各阶段命令及静态与动态链接的区别与适用场景。

CloudNative发布于 2026/3/21更新于 2026/6/416 浏览
Linux 环境下 C/C++ 编译流程与链接机制详解

前言

GCC(GNU Compiler Collection)是一个功能强大的编译器集合,支持多种语言,包括 C 和 C++。其中 gcc 用于 C 语言编译,g++ 专用于 C++ 编译。

在这里插入图片描述

Linux GCC or G++的安装

安装 GCC

运行以下命令安装 GCC:

sudo yum install gcc

安装完成后,可以再次检查版本:

gcc --version

在这里插入图片描述

安装 G++

运行以下命令安装 G++:

sudo yum install g++

安装完成后,可以再次检查版本:

g++ --version

在这里插入图片描述

Linux 的代码编译

预处理(Preprocessing)

预处理的工作
  • 去掉注释
  • 展开头文件
  • 条件编译
  • 宏替换

C++代码执行示例:

g++ -E code.cpp -o code.i # 生成预处理文件

在这里插入图片描述

编译(Compilation)

编译器将预处理后的源代码转换为汇编代码(文本形式的机器指令)。

  • 生成汇编代码(通常是 .s 文件)。
  • 编译器会进行语法分析和语义检查。
g++ -S code.i -o code.s # 生成汇编文件

在这里插入图片描述

汇编(Assembly)

汇编器将汇编代码(.s 文件)转换为二进制的目标代码(.o 文件)。

  • 汇编代码被转换为机器能够理解的指令。
  • 生成目标文件(通常是 .o 或 .obj 文件)。
g++ -c code.s -o code.o # 生成目标文件
od filename # 查看二进制内容

在这里插入图片描述

链接(Linking)

函数库(Library)简介

在编程中,函数库是指封装了一组可重用函数、类或其他代码模块的集合,目的是简化开发、提高代码复用性。函数库通常以静态库(*.a 或 *.lib)或动态库(*.so、*.dll 或 *.dylib)的形式存在。

在这里插入图片描述

类型描述
静态库在编译时将库的代码嵌入到可执行文件中,生成的文件独立运行,不依赖外部库。
动态库在运行时加载库文件,节省空间和内存,可以被多个程序共享。
动态链接

动态库(Dynamic Library)是一种在运行时加载的库,可以被多个程序共享,以节省存储空间和内存。动态库的文件扩展名在不同操作系统中有所不同:

  • Linux: .so(Shared Object)
  • Windows: .dll(Dynamic Link Library)
  • macOS: .dylib
ldd # 可以查看可执行程序所依赖的动态库

下面是 code 可执行文件所依赖的动态库:

在这里插入图片描述

静态链接

静态库是一种将一组目标文件(.o 文件)打包成单个文件(通常扩展名为 .a 或 *.lib)的技术,便于代码复用。静态库在编译时链接到可执行文件中,因此运行时不需要额外的库支持。

  • Linux: .a
  • Windows: .lib
g++ code.cpp -static -o code # -static 可以生成静态链接

在这里插入图片描述

动态 VS 静态

定义

链接方式定义
静态链接在编译阶段,将所需库的代码嵌入到可执行文件中,生成一个独立的可执行文件。
动态链接在运行时加载所需的库(动态库),可执行文件只包含对库的符号引用,库本身存储在外部文件中(如 .so)。

操作系统命名

操作系统静态库扩展名动态库扩展名
Linux.a.so
Windows.lib.dll
macOS.a.dylib

对比表

特性静态链接动态链接
生成的可执行文件大小较大(嵌入所有库代码)较小(仅包含对动态库的引用)
运行时依赖无需外部库,独立运行需要动态库文件
运行效率高(无需加载外部库,直接执行)稍低(运行时加载动态库)
内存使用每个程序独立占用库的代码和数据多个程序共享同一动态库
更新维护更新库后需重新编译程序更新库后程序无需重新编译
部署和兼容性部署简单,无需额外的动态库部署复杂,需要确保动态库存在并与程序兼容
符号冲突不易出现,因为库代码独立嵌入到每个可执行文件中可能出现多个库之间的符号冲突
适用场景嵌入式系统、小型独立工具、运行环境固定的场景大型系统、需要频繁更新库或共享库的场景

目录

  1. 前言
  2. Linux GCC or G++的安装
  3. 安装 GCC
  4. 安装 G++
  5. Linux 的代码编译
  6. 预处理(Preprocessing)
  7. 预处理的工作
  8. 编译(Compilation)
  9. 汇编(Assembly)
  10. 链接(Linking)
  11. 函数库(Library)简介
  12. 动态链接
  13. 静态链接
  14. 动态 VS 静态
  15. 定义
  16. 操作系统命名
  17. 对比表
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 基于 Python 和 AI 的智能害虫识别助手搭建
  • Java 入门:运算符与逻辑控制
  • Jupyter 安装指南:Anaconda、pip 及 Docker 方式
  • Python 3 详细安装与环境配置教程
  • 使用 ZeroNews 远程管理 OpenClaw Gateway Dashboard
  • Linux 匿名管道通信:原理与代码实现
  • 模拟算法专题:替换问号、提莫攻击、Z 字形变换等五题解析
  • 2026 年毕业季 AIGC 检测标准与应对策略
  • 本地项目上传 Gitee 完整操作指南
  • Llama 3.1 开源模型快速部署实战
  • AMD 显卡 llama.cpp Vulkan 后端兼容性与性能优化
  • JavaScript 基础语法与 jQuery 入门
  • Python 之父 Guido Van Rossum 宣布从 Dropbox 退休
  • OpenClaw 接入 QVeris 实现 AI 助手实时数据查询
  • Python 标准库详解:200+ 常用模块分类整理与使用指南
  • Open-WebUI 管理员面板深度拆解与配置指南
  • STM32 嵌入式系统设计:传感器采集与低功耗通信实战
  • AI 大模型落地的三个演进阶段:功能、任务与场景智能
  • 算法设计与分析:贪心算法
  • 基于 Web Unlocker 与 n8n 的自动化资讯采集与推送实践

相关免费在线工具

  • 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