Linux gcc和gdb的使用

news2025/1/11 14:04:46

gcc/g++编译器的使用

gcc如何使用

语法: gcc [选项] 编译文件

功能: 用于编译C语言程序,编译C++程序使用g++。

选项:

指令说明
-E只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
-S编译到汇编语言不进行汇编和链接
-c编译到目标代码
-o文件输出到文件
-static此选项对生成的文件采用静态链接
-g生成调试信息。GNU 调试器可利用该信息
-shared此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库
-O0(0-3)编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-w不生成任何警告信息。
-whall生成所有警告信息。

注意:gcc编译器编译不是直接生成可执行程序的,什么参数都不给的情况下它默认执行:预处理->编译->汇编->链接

预处理

预处理是程序执行的第一步,这一步主要是用于删除注释、头文件展开、宏替换和条件编译这几项操作,我们可以使用gcc的-E选项来进行查看它对源代码进行了那些处理。

image-20211211220659067

我们可以从图中观察到,这个阶段gcc确实进行了以上处理。

编译

编译这个阶段主要做的工作就是将C代码编译成汇编代码。

image-20211211221255049

汇编

这个阶段主要是生成目标文件,也就是windows下的obj文件而obj文件是二进制的因为已经成为机器码了,所以我们显示器上是无法显示出来的,通常能显示出来的都是乱码。

image-20211211221914040

链接

这个阶段主要是用于链接,虽然代码已经生成为机器码了,cpu能看懂但是它找不到里面的函数调用的地址,所以我们只需进行链接obj文件即可找到对应的函数地址,这个时候代码才是可执行程序。

由于链接不要参数直接输入

gcc obj文件

这个时候会得到a.out的可执行程序,如果有重命名的话那么就不是a.out。

[ls@VM-4-7-centos 11]$ ll
total 44
-rwxrwxr-x 1 ls ls  8400 Dec 11 22:23 a.out
-rw-rw-r-- 1 ls ls   401 Dec 11 22:08 test.c
-rw-rw-r-- 1 ls ls 16921 Dec 11 22:13 test.i
-rw-rw-r-- 1 ls ls  1569 Dec 11 22:19 test.o
-rw-rw-r-- 1 ls ls   507 Dec 11 22:19 test.s
[ls@VM-4-7-centos 11]$ ./a.out
heello centos
hello world
[ls@VM-4-7-centos 11]$ 

注意: gcc默认生成调用的是动态链接,如果需要静态链接需要带上gcc -static编程静态链接

什么是库?你可能会说我没听过库啊?而且也没使用过!

其实你一直都在使用库像C语言的头文件或者C++的头文件等等……你日常的写练习代码都是用过的,只是你没察觉到而那个阶段也不会有人跟你讲库的概念,所以你就会认为我从来没使用过库,而库又分为两种。

  1. 静态库
  2. 动态库

静态库

静态库顾名思义就是静态的,那么怎么个静态法呢?

像刚才上面的预处理阶段,我们就看到头文件展开了而且展开了很多直接让我们的代码从几十行增加到八百多行,而这是为什么呢?这其实就是静态库,静态库就是使用自己代码下面的函数时候不会去调外面的,而这样做的代价就是内存和磁盘占用就很大因为它是直接从动态库内拷贝过来的代码,但是它有一个优点不依赖第三方库任何平台都能跑移植性高。

总结:

  • 优点
    1. 移植性高
    2. 不依赖第三方库
  • 缺点
    1. 体积大
    2. 加载慢
    3. 存在空间浪费

动态库

动态库本质就是使用官方库里的函数,但是不会对其进行拷贝到本地,具体过程是:代码使用库函数->调用库->库返回调用结果。

这样做的优点就是不用会产生重复拷贝,使得代码占用体积小,内存加载更快,但是依赖第三方库平台不同库里面的内容也会不些小变动这使得移植性较差。

总结:

  • 优点
    1. 内存加载快
    2. 体积小
    3. 不存在空间浪费
  • 缺点
    1. 依赖第三方库
    2. 可移植性较差

gdb调试工具

注意: gcc编译出来的默认是release版本,这个版本是没有 调试信息的,我们需要手动调整成debug版本才有调试信息,需要在编译时加上-g选项才是debug版本。

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

makefile自动化编译工具

makefile自动化工具能使我们减少编译时要敲的代码,同时会不会用makefile也是考察你是否具有大型项目编程的能力,因为在LInux下大型项目有上百个obj文件,如果手打的话你可以想象一下效率有多低,其次如果除了bug调试的时候这样又打一遍岂不是折磨?

所以我们有必要掌握makefile这款自动化编译工具,有了它我们开发效率会比没有使用它更快,特别是当做大项目的时候有明显的差距。

make指令

语法: make

功能: 用于执行makefile的内容,使用make前必须有个makefile不然无法使用。

makefile的语法

使用makefile必须明白依赖关系和依赖方法,什么是依赖关系呢?依赖关系就好比你使用某个库的函数你必须包含这个库的头文件,这就是依赖关系那么依赖方法呢?

依赖方法也很简单可以理解成调用库函数的具体操作,在Linux下以上操作都是类似的。

具体操作我们先创建一个makefile文件,接着在里面写上如下指令:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AqXW8IH8-1675340707262)(https://cdn.jsdelivr.net/gh/ls02/Image/img/image-20211212181613038.png?raw=true)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JlMMwr8s-1675340709825)(null)]

这些已经可以完成绝大多数场景的使用了,暂时先讲到这,后续的文章会补充这个工具的其它操作。

生成多个可执行文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nSND3KDU-1675340709792)(null)]

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

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

相关文章

python设计模式-单例模式,工厂模式

单例模式 单例模式将类的实例化限制为一个对象。 它是一种创建模式,只涉及创建方法和指定对象的一个类。 它提供了创建实例的全局访问点。 如何实现一个单例类? 下面的程序演示了单例类的实现,并多次打印创建的实例。 class Singleton:_…

动态规划(详细解释)

日升时奋斗,日落时自省 目录 1、Fibonacci 2、字符串分割 3、三角矩阵 4、路径总数 5、最小路径和 6、背包问题 7、回文串分割 8、编辑距离 9、不同子序列 10、总结 DP定义: 动态规划是分治思想的延伸,通俗一点来说就是大事化小&a…

高密度 ARM 服务器如何引领“数智时代”发展,打通“智变质变”正循环

并行计算 | 多样性计算 | ARM架构 深度学习 | 高性能计算 | ARM服务器 如今随着算力、高性能计算的快速发展,数字经济已经成为全球经济增长的主引擎。数字经济的快速发展,使得深度学习、数据分析、数据挖掘等技术迅猛发展起来。伴随国家政策东数西算的…

无痕埋点在Android中的实现

无痕埋点在Android中的实现 目标 解决手动打点效率低下问题自动化埋点 本篇技术实现主要是运行是代理,不涉及到插桩技术,不引入插件,对业务影响点最小 技术难点 1. 如何拦截到所有的view的点击事件 view有个setAccessibilityDelegate方…

Day02-带你走进数据分析的世界

文章目录Day02-带你走进数据分析的世界数据分析正在影响我们的工作、生活数据分析和你想象中的一样吗我们应该具备的数据分析能力Day02-带你走进数据分析的世界 数据分析正在影响我们的工作、生活 随着全球经济数字化转型的发展,各行各业都积累了大量的数据。 具有…

微信小程序做全局登录弹窗

需求:在任意需要弹出登录的页面,后台返回需要登录状态码,弹出登录弹窗进行登录,并刷新当前页面 过程:因为微信小程序无法封装一个全局组件通过方法全局调用。因此只能封装一个公共组件,在需要弹窗的页面注册…

Spark入门指南

文章目录什么是SparkSpark学习路线Spark入门指南什么是Spark Apache Spark 是一个开源集群运算框架,最初是由加州大学伯克利分校 AMP 实验室所开发。相对于 Hadoop 的 MapReduce 会在运行完工作后将中间数据存放到磁盘中,Spark 使用了存储器内存运算技术…

SpringMVC之请求与响应

目录 一&#xff1a;设置请求映射路径 1. 环境准备 二&#xff1a;问题分析 三&#xff1a;设置映射路径 四&#xff1a;请求参数 一&#xff1a;设置请求映射路径 1. 环境准备 创建一个Web的Maven项目 pom.xml添加Spring依赖 <?xml version"1.0" encodi…

基于Android的电子影院系统

需求信息&#xff1a; 客户端&#xff1a; 1&#xff1a;用户注册登录&#xff1a;通过手机号码、用户名称以及密码完成用户的注册和登录 2&#xff1a;影院信息&#xff1a;用户可以查看发布的影院信息以及查看影院具体反映的电影信息以及可以查看电影的宣传片&#xff1b; 3&…

Linux - Linux命令大全

阅读前可参考 https://blog.csdn.net/MinggeQingchun/article/details/128547426 一、Linux系统管理 &#xff08;一&#xff09;查看Linux系统版本 1、查看Linux内核版本 1、cat /proc/version&#xff1a;Linux查看当前操作系统版本信息 2、uname -a&#xff1a;Linux查看…

STM32--SPI、I2C、CAND等常用通信外设总线概括

1. SPI SPI是串行外设接口&#xff08; Serial Peripheral Interface&#xff09;的缩写。 SPI&#xff0c;是一种高速的&#xff08;之前做学传输比特115200 112k, 而SPI传输速度为10Mbps&#xff09;&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管…

Allegro如何改变线宽操作指导

Allegro如何改变线宽操作指导 用Allegro做pcb设计的时候,改变走线线宽是非常常用的功能,如下图 线宽目前是12mil,需要把线宽改成15mil 具体操作如下 选择Edit选择Change

摆脱银行询证函的烦恼,契约锁推出银行询证函数字化解决方案

近日&#xff0c;中国财政部会同银保监会印发“财会[2022]39号文件”&#xff0c;明确要加快推进银行函证数字化建设。鼓励具备条件的会计师事务所和银行通过银行函证平台&#xff08;包括第三方函证平台和银行自建函证平台&#xff09;开展数字化函证&#xff0c;有效提升函证…

Jenkins集群配置/并发构建

Jenkins集群配置/并发构建1、集群配置步骤1.1 Jenkins服务器规划1.2 添加节点1.2.1 添加Jenkins-02节点1.2.2 添加Jenkins-03节点1.3 Item配置1.4 执行构建任务测试是否成功集群化构建可以有效提升构建效率&#xff0c;尤其是团队项目比较多或是子项目比较多的时候&#xff0c;…

2023前端调试技巧

前端工作中&#xff0c;不仅编码很重要&#xff0c;重现bug&#xff0c;解决bug的能力同样重要。而这些都离不开代码调试。大厂面试题分享 面试题库前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#xff1a;前端面试题库PC调试console.log()…

支付宝调用支付流程(沙箱环境)

文章目录实现效果&#xff1a;前提准备支付流程方案一1. 导入依赖2. 配置文件3. 支付宝初始化4. 唤起支付方案二1. 导入依赖2. 唤起支付实现效果&#xff1a; 前提准备 由于本文只是提及支付的流程及其一些相关知识点&#xff0c;所以前提数据自行准备&#xff0c;参考支付宝支…

Micropython ESP32

Micropython ESP32模块列表network模块WIFI STA模式WIFI AP模式machine模块CPU主频GPIO端口GPIO输入模式GPIO输出模式GPIO中断模式ADC模数转换DAC数模转换PWM脉冲宽度调制UART串口Timer定时器官方文档 下载固件 模块列表 network模块 help(network) object <module ‘net…

域名基础知识

1.域名的概念及作用 域名&#xff08;Domain Name&#xff09;&#xff0c;又称网域&#xff0c;是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称&#xff0c;用于在数据传输时对计算机的定位标识&#xff08;有时也指地理位置&#xff09;。 由于IP地址…

vulnhub之PRIME (2021): 2

1.信息收集 输入arp-scan 192.168.239.0/24发现192.168.239.168主机存活。 使用nmap对目标主机192.168.239.168进行端口收集,&#xff0c;发现存活端口&#xff1a;22、80、139、445、10123。 访问http://192.168.239.168/&#xff0c;没有发现可用的信息。 使用gobuster进…

1、Maven——Maven项目管理工具基本设置、把Maven集成到IDEA2022

目录 一、Maven相关参数配置 1、配置依赖&#xff08;jar包&#xff09;存储位置&#xff08;本地仓库&#xff09; 2、 配置依赖下载地址 二、把Maven集成到IDEA2022 一、Maven相关参数配置 1、配置依赖&#xff08;jar包&#xff09;存储位置&#xff08;本地仓库&#…