【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操作、文件共享、本地文件管理...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...

WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...

软件工程 期末复习
瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...