news 2026/4/21 4:24:38

GCC与GDB

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GCC与GDB

一、GCC 介绍

1.1 GNU 工具集

GNU 工具集由自由软件基金会发起,始于20世纪80年代初,旨在构建完全自由的操作系统,核心原则是保障用户自由使用、修改和分发软件的权利

工具类别工具名称主要功能应用场景
编译器gcc/g++将 C/C++ 源代码转换为可执行程序各类 C/C++ 项目开发
调试工具gdb设置断点、查看变量、分析内存,辅助代码调试软件开发调试阶段,排查程序错误
项目构建工具make依据 Makefile 自动处理编译依赖源文件多、依赖关系复杂的项目
目标文件分析工具objdump反汇编目标文件,查看二进制文件内容分析程序底层实现,排查目标文件相关问题
链接工具ld合并多个目标文件及库文件为可执行文件编译流程最后阶段,处理目标文件链接
静态库管理工具ar创建、修改和操作.a静态库文件大型项目中复用通用代码模块

1.2 GCC 是什么?

GCC(GNU Compiler Collection)即 GNU 编译器集合,是开源的跨平台编译器,核心功能是将源代码转换为可执行文件。

  • 起初用于编译 C 语言,现已支持 C++、Java 等多种语言
  • 是 GNU 工具链的核心,遵循 GNU 通用公共许可证(GPL)
  • 支持跨平台编译,方便在不同系统环境下进行软件开发

1.3 安装 GCC

操作命令说明
安装编译工具包sudo apt install build-essential包含 GCC 及其他相关编译工具
查看 GCC 版本gcc --version确认安装是否成功

💡 在 Linux 系统中,GCC 一般为预装软件,通常无需手动安装。

1.4 GCC 支持的文件类型

文件后缀文件类型含义说明
.c源代码文件采用 C 语言编写的源代码文件
.cpp源代码文件使用 C++ 语言编写的源代码文件
.h头文件源程序中包含的头文件,用于声明函数、变量等
.o目标文件源代码经过编译但尚未链接的中间文件
.a库文件(静态库)由目标文件构成的静态库文件
.so库文件(动态库)动态库文件

二、gcc 编译过程

2.1 默认编译(生成 a.out)

gcc 编译时默认不指定输出文件名,会自动生成a.out可执行文件。

bash

复制

# 语法格式 gcc 文件名.c # 注意:文件名不可丢掉后缀 # 示例 gcc hello.c # 生成 a.out ./a.out # 运行
特点说明
自动生成自动生成名为a.out的可执行文件,无需指定输出名
便捷快速适用于快速验证代码,初步验证代码功能
⚠️ 文件覆盖多次编译会覆盖旧的a.out文件
❌ 不适用生产环境正式项目中不推荐,难以区分程序功能,不便版本管理

2.2 指定输出文件名(推荐)

日常开发中最常用的编译方式,使用-o选项指定输出文件名。

bash

复制

# 语法格式 gcc 源文件 -o 输出文件名 # 示例 gcc hello.c -o hello # 编译生成名为 hello 的可执行文件 ./hello # 运行

2.3 四步编译过程

GCC 编译背后由四个关键步骤构成:预处理 → 编译 → 汇编 → 链接

第一步:预处理(Preprocessing)

bash

复制

gcc -E 源文件.c -o 预处理后文件.i
项目说明
操作处理#include#define等预处理指令,将头文件内容插入,替换宏定义
产出生成预处理后的文件(.i后缀)
第二步:编译(Compilation)

bash

复制

gcc -S 预处理后文件.i -o 汇编文件.s
项目说明
操作把预处理后的文件转为汇编语言代码,进行语法、语义分析及优化
产出得到汇编语言文件(.s后缀)
第三步:汇编(Assembly)

bash

复制

gcc -c 汇编文件.s -o 目标文件.o
项目说明
操作将汇编代码转换为目标机器码,形成目标文件
产出生成目标文件(.o后缀)
第四步:链接(Linking)

bash

复制

gcc 目标文件.o -o 可执行文件
项目说明
操作把目标文件与所需库文件(静态库或动态库)链接,解决函数和变量引用问题
产出生成可执行文件
四步编译流程总览
源文件 (.c) ↓ gcc -E(预处理) 预处理文件 (.i) ↓ gcc -S(编译) 汇编文件 (.s) ↓ gcc -c(汇编) 目标文件 (.o) ↓ gcc(链接) 可执行文件

2.4 gcc 常用编译选项

选项功能语法格式应用场景
-o指定编译输出文件的名称gcc 源文件 -o 输出文件名日常开发中明确输出文件名称,便于管理
-c只进行编译和汇编,不进行链接,生成目标文件gcc -c 源文件生成目标文件用于后续链接,或单独分析目标文件
-E仅对源文件进行预处理,输出预处理后的代码gcc -E 源文件 -o 预处理后文件名检查预处理指令执行情况
-S将源文件编译为汇编代码gcc -S 源文件分析编译器生成的汇编代码,学习汇编语言
-g生成调试信息,供调试器(如 gdb)调试gcc -g 源文件程序调试阶段排查问题(使用 GDB 前必须加)
-Wall开启大部分常见警告信息gcc -Wall 源文件发现代码中潜在问题,提高代码质量
-std指定编程语言标准gcc -std=标准 源文件确保代码按特定标准编译,增强兼容性和可移植性

三、gcc 多文件编程

在实际项目开发中,程序通常由多个源文件组成,需要将多个.c文件一起编译链接。

bash

复制

# 方式一:直接编译多个源文件 gcc file1.c file2.c -o 输出文件名 # 方式二:分别编译为目标文件,再链接(推荐,适合大型项目) gcc -c file1.c -o file1.o gcc -c file2.c -o file2.o gcc file1.o file2.o -o 输出文件名

💡方式二(分步编译)的优势:修改某个文件时,只需重新编译该文件对应的目标文件,无需全部重编译,大幅提升编译效率。


四、GDB 介绍

4.1 什么是 GDB?

GDB 是 GNU 项目下功能强大的调试工具,主要用于调试 C/C++/Go 等编程语言编写的程序。

4.2 GDB 核心功能

功能类别具体功能
运行状态检查动态检查程序运行状态(变量值、内存布局、寄存器内容等)
代码执行跟踪跟踪代码执行流程(单步执行、断点设置、函数调用等)
多线程调试支持多线程调试(查看线程状态、切换线程上下文等)

4.3 使用 GDB 前的准备

使用 GDB 调试程序前,编译时必须添加-g选项,为可执行文件添加调试信息!

bash

复制

# 编译时加 -g 选项 gcc -g -o program program.c # 说明:-g 选项告诉 GCC 在生成的可执行文件中包含调试信息, # 以便 GDB 能够识别变量名、函数名和行号等信息

4.4 启动和退出 GDB

操作命令说明
启动 GDBgdb 可执行文件名启动 GDB 并加载相应的可执行文件
退出 GDBquitq在 GDB 命令行中输入后按回车键退出

bash

复制

# 示例:启动 GDB 调试 program gdb program # 退出 GDB (gdb) quit

五、gdb 调试命令

5.1 完整调试命令表

命令分类具体命令命令说明使用示例
程序运行控制run / r运行程序,直至遇到断点或程序结束r
程序运行控制continue / c继续运行程序,直到下一个断点或程序结束c
代码查看list / l列出源代码l(默认列当前行附近) /l main(列 main 函数代码)
断点操作break / b在指定行号或函数处设置断点b 10(第10行设断点)/b main(main函数处设断点)
断点操作info b查看已设置断点的信息info b
断点操作delete / d删除指定编号的断点d 2(删除编号为2的断点)
调试方式next / n逐过程调试,不进入函数内部n
调试方式step / s单步调试,进入函数内部s
变量查看print / p查看变量的值p n(查看变量 n 的值)
变量查看display每次程序停止时自动显示变量的值display n(自动显示变量 n 的值)

5.2 next 与 step 的区别

命令全称功能适用场景
n(next)逐过程执行下一行,遇到函数调用直接跳过,不进入函数内部不关心某函数内部逻辑时使用
s(step)单步执行下一行,遇到函数调用会进入函数内部逐行执行需要跟踪某函数内部执行流程时使用

5.3 GDB 调试工作流程


六、速查总结

gcc 编译命令速查

操作命令说明
快速编译(默认输出)gcc hello.c生成a.out
指定输出文件名gcc hello.c -o hello生成hello可执行文件
仅预处理gcc -E hello.c -o hello.i生成.i预处理文件
编译为汇编gcc -S hello.i -o hello.s生成.s汇编文件
编译为目标文件gcc -c hello.s -o hello.o生成.o目标文件
链接生成可执行文件gcc hello.o -o hello链接生成可执行文件
带调试信息编译gcc -g -o hello hello.c供 GDB 调试使用
开启编译警告gcc -Wall hello.c -o hello显示潜在问题警告
多文件编译gcc file1.c file2.c -o out同时编译多个源文件

gdb 调试命令速查

命令缩写功能
runr运行程序
continuec继续运行到下一断点
listl查看源代码
break 行号/函数名b设置断点
info b查看断点信息
delete 编号d删除断点
nextn逐过程执行(不进函数)
steps单步执行(进入函数)
print 变量名p查看变量值
display 变量名持续监视变量
quitq退出 GDB

💡核心要点

  • 编译调试程序时必须加-g选项,否则 GDB 无法识别变量名和行号!
  • n(next)不进入函数内部,s(step)会进入函数内部,注意区分!
  • 生产环境编译应使用-o指定文件名,避免覆盖a.out
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/11 20:55:39

LC410. 分割数组的最大值【贪心 + 二分答案】

410. 分割数组的最大值 给定一个非负整数数组 nums 和一个整数 k ,你需要将这个数组分成 k 个非空的连续子数组,使得这 k 个子数组各自和的最大值 最小。 返回分割后最小的和的最大值。 子数组 是数组中连续的部分。 示例 1: 输入&#…

作者头像 李华
网站建设 2026/4/11 20:54:28

终极SketchUp STL插件完整指南:3D打印模型转换快速上手教程

终极SketchUp STL插件完整指南:3D打印模型转换快速上手教程 【免费下载链接】sketchup-stl A SketchUp Ruby Extension that adds STL (STereoLithography) file format import and export. 项目地址: https://gitcode.com/gh_mirrors/sk/sketchup-stl 你是否…

作者头像 李华
网站建设 2026/4/11 20:53:25

DCDC电源设计必看:Boost与BUCK拓扑的EMC优化差异解析

DCDC电源设计必看:Boost与BUCK拓扑的EMC优化差异解析 在电源设计领域,DCDC转换器的EMC性能优化一直是工程师们关注的焦点。Boost和BUCK作为两种最常见的开关电源拓扑,它们在EMC优化策略上既有共性又存在显著差异。本文将深入剖析这两种拓扑在…

作者头像 李华
网站建设 2026/4/11 20:51:16

Linux内核中的电源管理详解

Linux内核中的电源管理详解 引言 电源管理是Linux内核中一个重要的子系统,它负责管理系统的功耗,延长电池寿命,提高能源利用效率。随着移动设备和数据中心的普及,电源管理变得越来越重要。本文将深入探讨Linux内核中的电源管理机制…

作者头像 李华
网站建设 2026/4/11 20:50:57

LVGL二维码库实战:从API调用到嵌入式UI集成

1. LVGL二维码库入门指南 第一次接触LVGL二维码库时,我也被它简洁高效的API设计惊艳到了。这个轻量级库能在资源有限的嵌入式设备上快速生成二维码,特别适合智能门锁、工业控制面板这类需要紧凑型交互界面的场景。想象一下,用户只需用手机扫一…

作者头像 李华