Linux编辑器调试器 gcc/g++ gdb 编译过程及使用讲解

这恋爱呀 我有两不谈

第一异性不谈 因为我们性别不一样 我知道的她不知道相处起来太累

第二同性不谈 因为我们性别一样 我知道的他也知道相处起来太无聊了

–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀-正文开始-❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–

目录

一、gcc/g++编译过程讲解

1.背景知识

2.gcc/g++如何完成编译

1)预处理

2)编译

3)汇编

4)连接

3.函数库

4.gcc/g++使用指令

二、gdb使用

1.背景知识

2.gdb使用指令

三、完结撒❀


一、gcc/g++编译过程讲解

1.背景知识

g++完成文件编译一共分为一下四步:

1. 预处理(进行宏替换,去注释,条件编译,头文件包含等)

2. 编译(生成汇编)

3. 汇编(生成机器可以识别的二进制代码)

4. 连接(生成可执行文件或库文件)

2.gcc/g++如何完成编译

使用格式 g++   [选项]   要编译的文件名   [选项]   [目标文件名]

1)预处理(进行宏替换。。。)

● 预处理功能主要包括宏定义 , 文件包含 , 条件编译 , 去注释等。
● 预处理指令是以 # 号开头的代码行。
● 实例 : gcc –E hello.c –o hello.i
● 选项 “-E”, 该选项的作用是让 gcc 在预处理结束后停止编译过程。
● 选项 “-o” 是指目标文件 ,“.i” 文件表示为已经经过预处理的 C 原始程序。

2)编译(生成汇编)

● 在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等 , 以确定代码的实际要做的工作 , 在检查 无误后 ,gcc 把代码翻译成汇编语言
● 用户可以使用“-S” 选项来进行查看 , 该选项只进行编译而不进行汇编 , 生成汇编代码。
● 实例 : gcc –S hello.i –o hello.s

3)汇编(生成机器可识别的代码)

● 汇编阶段是把编译阶段生成的 “.s”文件转成目标文件
● 读者在此可使用选项 “-c” 就可看到汇编代码已转化为 “.o” 的二进制目标代码了
● 实例 : gcc –c hello.s –o hello.o

4)连接(生成一个可执行文件或库文件)

● 在成功编译之后 , 就进入了链接阶段。
● 实例 : gcc hello.o –o hello

3.函数库

在上面的编译过程中涉及到了一个概念:函数库

我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?
其实系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到
系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函
“printf”,而这也就是链接的作用

函数库一般分为静态库和动态库两种

静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”。

动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时 链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示: gcc hello.o –o hello。

gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证。

4.gcc/g++使用指令

● -E 只激活预处理,这个不生成文件,你需要把它重定向或者(-o)到一个输出文件里面

-S 编译到汇编语言不进行汇编和链接

-c 编译到目标代码

-o 文件输出到 文件

● -static 此选项对生成的文件采用静态链接

-g 生成调试信息

● -shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统有动态库

-O0

-O1

-O2

-O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高

-w 不生成任何警告信息。

-Wall 生成所有警告信息。

二、gdb使用

1.背景知识

● 程序的发布方式有两种, debug 模式和 release 模式
● Linux gcc/g++ 出来的二进制程序,默认是 release 模式
● 要使用 gdb 调试,必须在源代码生成二进制程序的时候 , 加上 - g 选项

2.gdb使用指令

以下调试命令大家如果熟悉VS下的调试功能可以对照VS下的调试功能进行理解

退出 gdb 调试: ctrl + d quit
list l 行号:显示 binFile 源代码,接着上次的位置往下列,每次列 10 行。
list l 函数名:列出某个函数的源代码。
r run :运行程序。
n next :单条执行。
s step :进入函数调用
break(b)  行号:在某一行设置断点
break  函数名:在某个函数开头设置断点
info break(b) :查看断点信息。
finish :执行到当前函数返回(结束),然后挺下来等待命令
print(p) :打印表达式的值,通过表达式可以修改变量的值或者调用函数
p 变量:打印变量值。
set var :修改变量的值
continue( c) :从当前位置开始连续而非单步执行程序(跳转到下一个断点位置)
run( r) :从开始连续而非单步执行程序
delete breakpoints :删除所有断点
delete breakpoints n :删除序号 n 的断点
disable breakpoints :禁用断点
enable breakpoints :启用断点
info( i) breakpoints(info b) :参看当前设置了哪些断点
display  变量名:跟踪查看一个变量,每次停下来都显示它的值(常显示)
undisplay :取消对先前设置的那些变量的跟踪
until X 行号:跳至 X
breaktrace( bt) :查看各级函数堆栈调用及参数
info i) locals :查看当前栈帧局部变量的值
quit :退出 gdb

三、完结撒❀

如果以上内容对你有帮助不妨点赞支持一下,以后还会分享更多编程知识,我们一起进步。
最后我想讲的是,据说点赞的都能找到漂亮女朋友❤

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/5210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【介绍下Android开发环境的搭建】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

什么是域名解析?域名解析的完整流程是什么?如何清理DNS缓存?(附源码)

目录 1、什么是域名? 2、为什么使用域名? 3、域名解析的完整流程 4、调用gethostbyname系统接口将域名解析成IP地址 5、为什么需要清理系统DNS缓存? 6、使用cmd命令清理DNS缓存 7、通过代码去清除系统DNS缓存 C软件异常排查从入门到精…

使用量排名前50的GPTs趋势和特征

Chatgpt的gpt商店已经有几千gpts了。目前哪些gpts比较受欢迎呢?有哪些趋势和投资呢? 根据whatplugin.ai(截止日期为2024年3月),使用量最多的50个gpts数据分析结果如下: GPTs类型的分布情况如下: 图像生成…

21.Nacos集群搭建

模拟Nacos三个节点,同一个ip,启动三个不同的端口: 节点 nacos1, 端口:8845 节点 nacos2, 端口:8846 节点 nacos3, 端口:8847 1.搭建数据库,初始化数据库表结构 这里我们以单点的数据库为例 首先新建一…

【C#】基础知识

0.参考 C#语言入门详解 1.几种打印hello_world的方式 1.1 console控制台 新建一个console,直接打印: Console.WriteLine("Hello_world");启动一闪而过,在vs调试中选择开始执行不调试(without debug)。 …

通话记录生成器怎么使用

通话记录生成器是一种可以模拟生成通话记录的软件工具,使用起来相对简单。以下是使用步骤: 导入目标号码:您需要将想要生成通话记录的目标号码输入到软件中。这可以通过直接复制粘贴电话号码,或者如果是图片或纸质文件中的号码&am…

分布式与一致性协议之CAP和Paxos算法(一)

CAP 理论 如何使用BASE理论 以InfluxDB系统中DATA节点的集群实现为例。DATA节点的核心功能是读和写,所以基本可用是指读和写的基本可用。我们可以通过分片和多副本实现读和写的基本可用。也就是说,将同一业务的数据先分片,再以多份副本的形…

四种网络IO模型

📝个人主页:五敷有你 🔥系列专栏:面经 ⛺️稳中求进,晒太阳 IO的定义 IO是计算机内存与外部设备之间拷贝数据的过程。CPU访问内存的速度远高于外部设备。因此CPU是先把外部设备的数据读取到内存,在…

有趣的大模型之我见 | Llama AI Model

Llama 开源吗? 我在写《有趣的大模型之我见 | Mistral 7B 和 Mixtral 8x7B》时曾犹豫,在开源这个事儿上,到底哪个大模型算鼻祖?2023 年 7 月 18 日,Meta 推出了最受欢迎的大型语言模型(LLM)的第…

20 | 幻读是什么,幻读有什么问题?

幻读是什么? 假设的场景,不是真实的结果 幻读”做一个说明: 在可重复读隔离级别下,普通的查询是快照读,是不会看到别的事务插入的数据的。因此,幻读在“当前读”下才会出现。上面 session B 的修改结果,被 session A 之后的 select语句用“当前读”看到,不能称为幻读…

iview 自定义项求和的方法和错误点

这是iview自定义某几项参数合计的方法,其实是蛮简单的,很多人自定义合计的时候,老是会不知道怎么处理除了需要合计的几项的其他项,其实不需要管,不需要合计的项直接返回空就好了,需要的就在计算的里面做key…

ThreeJs模拟工厂生产过程八

这节算是给这个车间场景收个尾,等了几天并没有人发设备模型给我,只能自己找了一个凑合用了。加载模型之前,首先要把货架上的料箱合并,以防加载模型之后因模型数量多出现卡顿,方法和之前介绍的合并传送带方法相同&#…

【HTTP协议】了解http需要学习哪些内容

HTTP(Hypertext Transfer Protocol)是超文本传输协议,互联网上应用最广泛的一种协议,它负责在客户端和服务器之间传输数据。本文将从HTTP协议的基本原理、请求-响应模型、常见特性以及应用场景等方面进行总结。 1. HTTP基本原理 …

react 基于qrcode.react生成颜色不同 , 样式不同的二维码

实现效果: 1 首先在react中 , 导入下载qrcode.react npm install qrcode.react2 在react中导入使用 , 并导入ui样式 import QRcode1 from /assets/images/QRcode1.png import QRcode2 from /assets/images/QRcode2.png import QRcode3 from /assets/images/QRcode3.png impo…

Qt客服端开发的组件库

Qt 是一个功能丰富的跨平台 C 应用程序框架,它包含了许多用于不同目的的组件库。以下是一些主要的 Qt 组件库,这些库为开发者提供了广泛的工具和功能,以便构建复杂的应用程序。北京木奇移动技术有限公司,专业的软件外包开发公司&a…

二、再识VUE-MVVM

一、初识VUE 二、再识VUE-MVVM 三、VUE数据代理 MVVM Vue.js 专注于 MVVM 模型的 ViewModel 层。它通过双向数据绑定把 View 层和 Model 层连接了起来。实际的 DOM 封装和输出格式都被抽象为了 Directives 和 Filters。 ViewModel 一个同步 Model 和 View 的对象。在 Vue.js…

综合性练习(后端代码练习1)——加法计算器

目录 一、准备工作 二、约定前后端交互接口 1、概念介绍 2、需求分析 3、接口定义 请求参数 响应数据 三、服务器代码 四、前端页面代码 五、运行测试 遇到问题如何解决? 需求:输入两个整数,点击 “点击相加” 按钮,显…

计算机服务器中了mkp勒索病毒怎么办,mkp勒索病毒解密数据恢复流程

网络技术的不断应用与发展,为企业的生产运营带来了极大便利,越来越多的企业依赖网络开展各项工作业务,网络也大大提升了企业的生产运营效率,但网络是一把双刃剑,在为企业提供便利的同时,也为企业的数据安全…

M2 Mac mini跑Llama3

前言 在4-19左右,Meta 宣布正式推出下一代开源大语言模型 Llama 3;共包括 80 亿和 700 亿参数两种版本,号称 “是 Llama 2 的重大飞跃”,并为这些规模的 LLM 确立了新的标准。实际上笔者早就体验过,只不过自己电脑没什…

238 基于matlab的水平轰炸弹道的求解

基于matlab的水平轰炸弹道的求解,列出轰炸弹道方程组并利用龙格库塔法解算弹道方程。设计中包含了二维弹道与三维弹道的计算,并都绘制了弹道运动轨迹,最终还将整个题目集中在一个图形用户界面(GUI)上。程序已调通&…