【Hello Linux】Linux工具介绍 (gcc/g++ gdb)
作者:@小萌新
专栏:@Linux
作者简介:大二学生 希望能和大家一起进步!
本篇博客简介:介绍Linux的常用工具gcc/g++ 以及gbd
Linux工具介绍
- gcc / g++
- gcc / g++的作用
- 为什么语言要经过这四步才能变为可执行指令
- gcc / g++语法
- 预处理
- 编译
- 汇编
- 链接
- 动态库和静态库
- gdb
- debug和release
- gdb指令
gcc / g++
gcc / g++的作用
gcc和g++分别是GNU的C和C++的编译器
我们都知道语言从源文件到可执行指令要分为以下四个步骤
- 预处理 (去除注释 头文件展开 宏替换 条件编译)
- 编译 (将c/c++ 代码翻译成汇编代码)
- 汇编 (将汇编代码转化为二进制语言)
- 链接 (将汇编过程产生的二进制语言进行连接)
为什么语言要经过这四步才能变为可执行指令
我们在上一些语言课的时候 一些学校里的教授可能跟我们讲过它们那个年代是怎么进行编程的
打孔编程

不过后面人们发现 这种打孔编程的指令很难让人记住并且效率极其低下 于是乎人们便发明出了汇编语言
从此之后我们变开始用汇编语言进行代码编程
汇编的语言的编译过程是这样子的

之后呢随着时代的进步 人们认为汇编语言还是太过复杂了 于是乎c语言就被发明出来了
之后c语言想要变成二进制文件就有两条路

c语言是直接变成二进制文件简单一点还是先变成汇编语言再变成二进制文件简单一点?
很显然 如果直接从c语言直接变成二进制文件的话等于前面几十年的努力全部被白费了
但是如果先变成汇编语言的话就简单很多 而且汇编语言变成二进制文件也是可以借鉴之前的经验的

当然由于C语言的编写中可能会存在大量的注释以及头文件的展开等
所以我们还需要预处理这一步骤将注释全部清除 将头文件展开
gcc / g++语法
我们常用的gcc语法是这样子的
gcc/g++ 选项 文件
下面是gcc g++的一些选项 其中前面七个选择特别重要 需要记住
- -E 只进行预处理 不生成文件 你需要把他重定向到一个输出文件里面(否则将把预处理后的结果打印到屏幕上)
- -S 编译到汇编语言
- -c 编译到目标代码(二进制文件)
- -o 将处理结果输出到指定文件 该选项后需紧跟输出文件名
- -static 此选项对生成的文件采用静态链接
- -shared 此选项将尽量使用动态库,生成文件较小
- -g 生成调试信息(若不携带该选项则默认生成release版本)
- -w 不生成任何警告信息
- Wall 生成所有警告信息
- -O0/-O1/-O2/-O3 编译器优化选项的四个级别 -O0表示没有优化 -O1为缺省值 -O3优化级别最高
预处理
预处理的作用包括下面四个
- 去除注释
- 头文件展开
- 宏替换
- 条件编译
接下来我们敲出下面的代码 让预处理之后的文件输出到test.i文件中
gcc -E test.c -o test.i
我们分别在C文件中添加上注释 头文件 宏替换和条件编译语句

我们可以发现经过预处理之后代码膨胀到了800多行 这是因为头文件展开的效果
条件编译和宏替换是同步进行的 因为N是100 非0表示真 所以执行的是
hello vim!
最后我们可以发现注释也全部消除了

编译
编译的作用包括下面两个
代码如下
gcc -S test.i -o test.s
- 检查代码语法是否有错误
- 将代码翻译成汇编语言

我们可以发现代码都变成汇编语言了
当然要是我们编写的代码中有一些语法的错误的话 在编译这一步就会停止
汇编
汇编的作用主要有一个
- 将汇编语言翻译成二进制语言
代码如下
gcc -c test.s -o test.o

我们可以发现这里变成了我们看不懂的乱码 实际上这里就是二进制语言
链接
链接的作用主要有一个
- 将生成的 .o文件(二进制文件) 进行链接
代码如下
gcc test.o -o testhv

之后我们便得到了一个可执行文件了
运行它 就能发现屏幕输出 hello vim!

动态库和静态库
函数库一般分为静态库和动态库两种:
- 静态库是指编译链接时 把库文件的代码全部加入到可执行文件当中 因此生成的文件比较大 但在运行时也就不再需要库文件了 静态库一般以.a为后缀
- 动态库与之相反 在编译链接时并没有把库文件的代码加入到可执行文件当中 而是在程序运行时由链接文件加载库 这样可以节省系统的开销 动态库一般以.so为后缀
映射到我们现实生活中

动态库就是网吧 你在宿舍里面写作业 当你遇到不会的题目的时候就回去网吧搜索 这道题目应该怎么做
而静态库就是你自己买了个电脑 以后遇到不会的题目就可以在自己宿舍查了
动态链接:
- 优点:省空间 bin体积小 加载速度快
- 缺点:依赖动态库 程序可移植性较差
静态链接:
- 优点:不依赖第三方库 程序的可移植性较高
- 缺点:浪费空间
我们的gcc/g++编译器默认使用的是动态链接
我们可以使用file指令查看

我们还可以使用ldd指令来查看可执行文件所依赖的库

其中的 /lib64/libc.so.6就是c语言标准库
我们可以使用 -static指令来强制进行静态链接
如果我们编译的过程中出现这个错误
/usr/bin/ld: cannot find -lc
collect2: error: ld returned 1 exit status
这是由于我们的云服务器中没有安装静态库引起的
这个时候我们只需要下载一下静态库就可以了
下载指令如下
sudo yum install -y glibc-static libstdc++-static
这个时候我们使用ldd指令就可以发现

此外 因为静态链接里面包含了整个静态库 所以说代码会膨胀很多倍

这也刚好证明了动态链接的优点 省空间
gdb
debug和release
我们在C语言的学习阶段就知道了程序有两种发布版本
分别是 release 和 debug
- debug版本:程序本身会被加入更多的调试信息 以便于进行调试
- release版本:不会添加任何调试信息 是不可调试的
我们在linux中默认生成的文件都是release版本的 是不可以使用gbd调试的
如果我们想要它可被调试则需加入debug信息
具体指令如下
gcc test.c -o testhv_g -g

我们可以发现debug版本的代码确实比release代码大一点 这是因为多了调试信息
gdb指令
【进入gdb】
- gdb 文件名
【调试】
- 「run/r」:运行代码(启动调试)
- 「next/n」:逐过程调试
- 「step/s」:逐语句调试
- 「until 行号」:跳转至指定行
- 「finish」:执行完当前正在调用的函数后停下来
- 「continue/c」:运行到下一个断点处
- 「set var 变量=x」:修改变量的值为x (不常用)
【显示】
- 「list/l n」:显示从第n行开始的源代码 每次显示10行 若n未给出则默认从上次的位置往下显示
- 「list/l 函数名」:显示该函数的源代码
- 「print/p 变量」:打印变量的值
- 「print/p &变量」:打印变量的地址
- 「print/p 表达式」:打印表达式的值 通过表达式可以修改变量的值
- 「display 变量」:将变量加入常显示(每次停下来都显示它的值
- 「display &变量」:将变量的地址加入常显示
- 「undisplay 编号」:取消指定编号变量的常显示
- 「bt」:查看各级函数调用及参数
- 「info/i locals」:查看当前栈帧当中局部变量的值
【断点】
- 「break/b n」:在第n行设置断点
- 「break/b 函数名」:在某函数体内第一行设置断点
- 「info breakpoint/b」:查看已打断点信息
- 「delete/d 编号」:删除指定编号的断点
- 「disable 编号」:禁用指定编号的断点
- 「enable 编号」:启用指定编号的断点
【退出gdb】
- 「quit/q」:退出gdb
相关文章:
【Hello Linux】Linux工具介绍 (gcc/g++ gdb)
作者:小萌新 专栏:Linux 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:介绍Linux的常用工具gcc/g 以及gbd Linux工具介绍gcc / ggcc / g的作用为什么语言要经过这四步才能变为可执行指令gcc / g语法预处理编…...
TeamFiltration:一款针对O365 AAD账号安全的测试框架
关于TeamFiltration TeamFiltration是一款针对O365 AAD账号安全的跨平台安全测试框架,在该工具的帮助下,广大研究人员可以轻松对O365 AAD账号进行枚举、喷射、过滤和后门植入等操作。TeamFiltering与CrackMapExec非常相似,它可以创建并维护一…...
你是真的“C”——Visual Studio 2022(VS2022)编译器 -—实用调试技巧
你是真的“C”——Visual Studio 2022(VS2022)编译器 -—实用调试技巧😎前言🙌1. 什么是bug?🙌2. 调试是什么?有多重要?🙌2.1 调试是什么?2.2 调试的基本步骤…...
数据结构与算法:7种必须会的排序以及3种非基于比较排序
1.什么是排序 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序…...
数据库用户数
Oracle的用户数 oracle软件内部并没对用户数做限制,买5个用户数,指你买了5个user licences,从法律上只能连5个session,超过5个的连接都是非法的。oracle不给你技术上的限制,可是给你法律上的限制。 一般来讲…...
nginx如何用html显示多个图片并加入播放链接
需求背景通过nginx来做个点播服务,ffmpeg截取视频中的某一帧作为视频的封面,前端页面展示这个封面,,并链接到对应的视频播放链接,加载播放器进行播放简单介绍一下ffmpeg截取视频中的某一帧的方式截取视频的第一帧&…...
【蓝桥杯集训·每日一题】Acwing 3729. 改变数组元素
文章目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解三、知识风暴一维差分区间合并一、题目 1、原题链接 3729. 改变数组元素 2、题目描述 给定一个空数组 V 和一个整数数组 a1,a2,…,an。 现在要对数组 V 进行 n 次操作。 第 i 次操作的…...
springmvc执行流程
文章目录前言一、springMVC请求执行流程二、组件说明以下组件通常使用框架提供实现:总结前言 本篇文章是对springmvc的补充 接上篇文章springmvc入门https://blog.csdn.net/l_zl2021/article/details/127120873 一、springMVC请求执行流程 1.用户发送请求至前端控制…...
SpringMVC(2)
一)接受到JSON格式的数据:使用RequestBody来进行接收 ResponseBody表示的是返回一个非页面的数据 RequestBody表示的是后端要接受JSON格式的数据 一)接收单个格式的JSON格式的数据,我们使用一个对象来进行接收 1)我们之前接受GET请求中的queryString中的参数的时候&…...
Jackson序列化json时null转成空串或空对象
在项目中可能会遇到需要将null转"",可以通过以下方法解决。一:添加JacksonConfig 配置import com.fasterxml.jackson.core.JsonGenerator;import com.fasterxml.jackson.databind.JsonSerializer;import com.fasterxml.jackson.databind.Objec…...
如何将Python的上级目录的文件导入?【from.import】
假如有如下目录: -python ----file1 ---------file1_1 ------------------pfile1_1.py ---------pfile1.py ----file2 ---------pfile2.py ----pfile.py ----data.py 在pfile1_1.py中想要将pfile.py 导入怎么办? 首先将其上级目录添加到系统目…...
Java实现碧蓝航线连续作战
目录一.实现功能二.主要思路三.代码实现四.用exe4j生成.exe程序五.最终效果六.代码开源一.实现功能 主线图作战结束到结算页自动点击再次前往 二.主要思路 判断是否进入了结算界面:记录结算界面某个像素点的RGB值,每隔3秒对这个像素点进行比对 移动鼠标…...
Docker笔记
文章目录1.docker为什么会出现2.docker是什么3.传统虚拟机和容器的对比3.1虚拟机3.2容器虚拟化技术3.3两者对比3.4为什么Docker会比VM虚拟机快?4.docker能干嘛6.docker的应用场景7.docker三要素一:镜像(Image)二:容器&…...
情人节使用AI TOOL来创建一个甜言蜜语的女伴
一、首先使用chatgpt生成一段情侣间的对话,需要反复几次,达到满意的程度,然后将女方的话归在一起。 这是一个情侣私下谈话的场景,女方表示对男朋友精心准备的情人节安排和礼物表示很满意 二、 打开网站:https://lexic…...
G-GhostNet(IJCV 2022)原理与代码解析
paper:GhostNets on Heterogeneous Devices via Cheap Operationscode:https://github.com/huawei-noah/Efficient-AI-Backbones/blob/master/g_ghost_pytorch/g_ghost_regnet.py前言本文提出了两种轻量网路,用于CPU端的C-GhostNet和用于GPU端…...
Ethercat系列(5)TWcat3激活过程的协议分析(续1)
顺序写系统时间偏移从-》主顺序写时间延迟主-》从从-》主顺序写分布式时钟启动主-》从从-》主读多重写系统时间主-》从从-》主顺序写应用层控制主-》从从-》主顺序读错误计数器主-》从从-》主顺序读应用层状态主-》从从-》主顺序读应用层,广播写错误计数器主-》从从…...
QT入门Input Widgets之QScrollBar
目录 一、界面布局功能 1、界面位置介绍 2、控件界面基本属性 2.1 horizontalScrollBar界面属性 3、样式设置 此文为作者原创,创作不易,转载请标明出处! 一、界面布局功能 1、界面位置介绍 QScrollBar主要分为两种,一种垂直…...
【ML】基于机器学习的心脏病预测研究(附代码和数据集,多层感知机模型)
写在前面: 首先感谢兄弟们的订阅,让我有创作的动力,在创作过程我会尽最大努力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 之前创作过心脏病预测研究文章如下: 【ML】基于机器学习的心脏病预测研究(附代码和数据集,逻辑回归模型) 【ML】基于机…...
工序排序问题--约翰逊法精讲
什么是约翰逊法?约翰逊法是作业排序中的一种排序方法。选出最短加工时间i*,若最短加工时间有多个,任选1个.若i*出现在机床1,它对应的工件先安排加工,否则放在最后安排,安排后划去该工件,重复上两个步骤,直…...
WebDAV之葫芦儿·派盘+网盘精灵
网盘精灵 支持WebDAV方式连接葫芦儿派盘。 推荐一款让您的iPhone、iPod、iPad 变成WebDav客户端的软件,支持从WebDav服务器连接葫芦儿派盘服务进行上传和下载件。 网盘精灵让您的iPhone、iPod、iPad 变成WebDav客户端。功能:WebDav操作、文件共享、本地文件管理...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
