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

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

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

CloudNative发布于 2026/3/21更新于 2026/10/2591 浏览
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. 对比表

更多推荐文章

查看全部
  • Halcon 20.11 安装避坑指南与 License 配置详解
  • 联邦学习实践:用 Llama Factory 在分布式数据上训练模型
  • 文心一言 4.5 开源模型部署实战与多场景应用解析
  • 基于 Spring Boot 的上门帮厨管理系统设计与实现
  • 从零开始将本地项目代码推送到 GitHub 仓库指南
  • Effective Modern C++ 第 38 条:std::thread 与 std::future 析构行为详解
  • 2026 年十大 AI 编程工具推荐
  • Windows 11 安装 JDK 25:下载、配置环境变量及验证
  • 基于 OpenClaw 框架搭建自动化 AI 选股系统
  • 二分答案专题实战:木材加工与砍树问题详解
  • 自律计划第九期回顾与思考
  • Python adbc-driver-manager 包语法参数与实际应用案例
  • OpenCode 与 GitHub Copilot 生产环境落地对比评测
  • SpringAI Agent 实战:利用 Skills 构建代码评审智能体
  • VS Code 中 Python 代码格式化工具选型与配置
  • 亥时无人机一体化平台:AI 监测与全流程管控方案
  • 高精度加法算法实现详解
  • OpenClaw 对接 QQ 机器人:本地及腾讯云部署方案
  • 无人机发展简史:从古代传说到现代飞行器设计
  • OpenClaw 飞书接入指南:无需服务器通过长连接运行机器人

相关免费在线工具

  • 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