Linux基础——Linux开发工具(gcc/g++,gdb)

前言:在上一篇我们简单介绍了yum,vim的一些常用的指令和模式,现在让我们来进一步了解其他的Linux环境基础开发工具gcc/g++,gdb。


如果对前面yum和vim有什么不懂的建议回顾去回顾上期知识!!!

Linux开发工具(yum, vim)


在这里插入图片描述


首先让我们来初步了解一下本篇的内容:
1. 学习gcc/g++,并能学会如何使用
2. 学习gdb使用,并能进行简单调试

在这里插入图片描述

本篇主要内容:
Linux编译器-gcc/g++使用
Linux调试器-gdb使用

在这里插入图片描述


Linux开发工具

  • 1. Linux编译器-gcc/g++
    • 1.1 gcc/g++的使用方法
    • 1.2 预处理
    • 1.3 编译
    • 1.4 汇编
    • 1.5 链接
  • 2. 函数库
  • 4. Linux调试器-gdb使用
  • 4. 总结


1. Linux编译器-gcc/g++

首先,让我们先来分别了解一下彼此在GNU的作用。

gcc: C语言编译器,只能编译C语言

g++: C++编译器,C/C++都可以编译


gcc和g++在执行编译的时候一般有以下四个步骤:

  1. 预处理(进行宏替换)
  2. 编译(生成汇编)
  3. 汇编(生成机器可识别代码)
  4. 链接(生成可执行文件或库文件)

1.1 gcc/g++的使用方法

gcc/g++使用方法如下:

生产的可执行程序a.out
指令:gcc code.c

自定义可执行程序的名字
指令:gcc code.c -o 自定义名称

注意:-o 将处理结果输出到指定文件,该选项后需紧跟输出文件名。


让我们来进行一个简单的测试:

在这里插入图片描述
在这里插入图片描述
如果我们想执行这个程序,我们可以:

指令./a.out

在这里插入图片描述
注意:必须加上.才表示要在当前目录下找可执行文件。

接下来,让我们深入了解gcc/g++的四个步骤:
预处理阶段,编译阶段,汇编阶段,链接阶段


1.2 预处理

在预处理阶段的主要功能包括:宏定义,头文件展开,条件编译,去注释等

我们直接用指令查看一下:
指令:gcc -E test.c -o test.i

  • -E选项的作用是让gcc/g++在预处理结束后停止编译过程, 生成.i文件

在这里插入图片描述

我们直接进入探索。
在这里插入图片描述

可以发现,我们写的代码明明只有几行,但是在test.i中,却多出几百行代码,而这些代码就是预处理阶段展开的头文件,去注释,宏替换,条件编译等操作而出现的。


1.3 编译

在汇编阶段,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查
无误后,gcc 把代码翻译成汇编语言。

简而言之就是:将C语言翻译为汇编代码


我们直接用指令查看一下:
指令:gcc -S test.i -o test.s

  • -S选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码, 生成.s文件

在这里插入图片描述
我们依然直接进入看看
在这里插入图片描述
这里面将代码翻译成了汇编语言

注意:我们可以直接使用指令从.c文件变为.s文件


1.4 汇编

在汇编阶段,就是把编译阶段生成的“.s”文件转成目标文件

将汇编代码变成可重定位二进制文件

我们直接用指令查看一下:
指令:gcc -c test.i -o test.o

  • -c得到汇编代码转化为.o的二进制目标代码,形成.o文件

在这里插入图片描述
我们还是直接进入看看
在这里插入图片描述
我们发现文件里面是乱码,也就是二进制文件

注意:我们可以直接使用指令从.c文件或.i文件变为.o文件


1.5 链接

在完成预处理,编译,汇编后就到了链接阶段,链接的主要任务就是将生成的各个.o文件进行链接,生成可执行程序

.o文件 + 系统库 = 可执行程序

因此这里又涉及到一个重要的概念:函数库

我们直接用指令查看一下:
指令:gcc test.o -o test

若未自定义文件名称,则为a.out

在这里插入图片描述


2. 函数库

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

  • 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也
    就不再需要库文件了。其后缀名一般为.a
  • 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时
    链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为.so,如前面所述的 libc.so.6 就是动态
    库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件

我们可以用指令来查看一个可执行程序依赖的库:
指令:ldd 可执行程序

在这里插入图片描述
因此,test可执行程序所依赖的标准库在路径lib64里有一个文件叫libc.so.6

在这里插入图片描述
所以链接过程就是将.o文件和动/静态库结合的过程

动态库:

优点:省空间,形成的可执行程序体积较小
缺点:有强依赖性,依赖动态库

静态库:

优点:不依赖动态库,可以独立运行
缺点: 体积太大,浪费资源


Linux和windows下的动静态库命名是不太一样的
在这里插入图片描述

我们在编译代码时,默认采用的是动态链接,Linux下绝大多数库都是动态库,如果我们想静态链接:

指令:gcc test.c -static


下面给大家列举出了gcc的常用选项
在这里插入图片描述

4. Linux调试器-gdb使用

首先了解一下程序发布的方式:
程序的发布方式有两种,debug模式和release模式
Linux gcc/g++出来的二进制程序,默认是release模式

  1. debug版本:程序本身会加入调试信息,可以进行调试
  2. release版本:不会添加任何调试信息,是能调试

要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项

在这里插入图片描述因为在debug版本下,会加入调试信息,所以程序的大小比release版本下的大!


我们想进入gdb模式,我们可以:

指令:gdb 文件名

我们想退出gdb模式,我们可以:

指令:ctrl + dquit

下面给大家介绍一下常用的gdb指令:
调试:

r或run:运行程序
n 或 next:单条执行
s或step:进入函数调用
until X行号:跳至X行
finish:执行到当前函数返回,然后挺下来等待命令
continue或c:运行到下一个断点处
set var 变量=x:修改变量的值为x

显示:

list/l n:显示从第n行开始的源代码,接着上次的位置往下列,每次列10行
list/l 函数名:列出某个函数的源代码
print/p 变量:打印变量的值
print/p 表达式:打印表达式的值,通过表达式可以修改变量的值
display 变量:跟踪查看一个变量,每次停下来都显示它的值
undisplay 编号:取消指定编号变量的常显示
info/i locals:查看当前栈帧当中局部变量的值

断点:

break/b n:在第n行设置断点
break 函数名:在某个函数开头设置断点
info break/b:查看已打断点信息
delete/d 编号:删除指定编号的断点
disable 编号:禁用指定编号的断点
enable 编号:启用指定编号的断点

Linux调试器-gdb我们就介绍到这里,调试器需要大家多去使用才能更好的理解与记忆


4. 总结

在理解完本篇之后希望各位都能理解gcc/g++的四个步骤,gdb的简单使用方法!
在这里插入图片描述
谢谢大家支持本篇到这里就结束了
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言基础:初识指针(二)

当你不知道指针变量初始化什么时,可以初始化为空指针 int *pNULL; 我们看NULL的定义,可以看出NULL是0被强制转化为Void* 类型的0;实质还是个0; 如何避免野指针: 1. 指针初始化 2. 小心指针越界 3. 指针指向空间…

debian gnome-desktop GUI(图形用户界面)系统

目录 🌞更新 🎨安装 🍎分配 🛋️重启 🔑通过VNC连接 debian gnome-desktop 🌞更新 sudo apt update sudo apt -y upgrade 🎨安装 sudo apt -y install task-gnome-desktop 这个过程比…

Java设计模式 _结构型模式_适配器模式

一、适配器模式 **1、适配器模式(Adapter Pattern)**是一种结构型设计模式。适配器类用来作为两个不兼容的接口之间的桥梁,使得原本不兼容而不能一起工作的那些类可以一起工作。譬如:读卡器就是内存卡和笔记本之间的适配器。您将…

Sy8网络管理命令(ubuntu23.10和centos8)

前言、 本次实验主要是扩展学习,不仅限在课本的内容。毕竟课本的内容太过于陈旧了。需要的童鞋看看。 说明:(书本中sy9”第3.实验内容“大家还是要做下。) 1、使用ubuntu做实验的童鞋只要看第二、三、四、七章节的部分内容。 2、使…

单片机为什么有多组VDD?

以前我在画尺寸小的PCB时,比较头痛,特别是芯片引脚又多的,芯片底下,又不能打太多过孔。 可能有些老铁也比较好奇,为什么一个单片机芯片,有这么多组VDD和VSS。 比如下面这个100个引脚的STM32单片机。 有5组…

Blender基础操作

1.移动物体: 选中一个物体,按G,之后可以任意移动 若再按X,则只沿X轴移动,同理可按Y与Z 2.旋转物体: 选中一个物体,按R,之后可以任意旋转 若再按X,则只绕X轴旋转&…

STM32、GD32等驱动AMG8833热成像传感器源码分享

一、AMG8833介绍 1简介 AMG8833是一种红外热像传感器,也被称为热感传感器。它可以用来检测和测量物体的热辐射,并将其转换为数字图像。AMG8833传感器可以感知的热源范围为-20C到100C,并能提供8x8的像素分辨率。它通过I2C接口与微控制器或单…

全面解析平台工程与 DevOps 的区别与联系

平台工程的概念非常流行,但很多开发人员仍然不清楚它是如何实际运作的,这是非常正常的。 平台工程是与 DevOps 并行吗?还是可以相互替代?或者 DevOps 和平台工程是两个完全不同的概念? 一种比较容易将两者区分开来的方…

Feign负载均衡

Feign负载均衡 概念总结 工程构建Feign通过接口的方法调用Rest服务(之前是Ribbon——RestTemplate) 概念 官网解释: http://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign Feign是一个声明式WebService客户端。使用Feign能让…

AI大模型探索之路-训练篇5:大语言模型预训练数据准备-词元化

系列文章目录🚩 AI大模型探索之路-训练篇1:大语言模型微调基础认知 AI大模型探索之路-训练篇2:大语言模型预训练基础认知 AI大模型探索之路-训练篇3:大语言模型全景解读 AI大模型探索之路-训练篇4:大语言模型训练数据…

法律知识学习考试系统 C#+uniapp+asp.net微信小程序

技术要求:后端C#,安卓app,mysql数据库 系统分为管理员、教师端和学生端: 管理员端实现管理员的注册登录以及教师和学生的注册、法律法规内容的发布与更新、法律法规页面的评论的添加与删除、内容查询、知识小测的内容发布与删除、问卷调查的发…

云计算和边缘计算究竟有什么不同

在数据时代,无论是人的活动还是机器的运作都会产生各种各样海量的数据。在对数据梳理和筛选过程中,计算机的运算处理必不可少。为了减少本地计算机算力成本等限制,越来越多的企业选择了云计算和边缘计算。今天,德迅云安全就带您来…

SpikingJelly笔记之梯度替代

文章目录 前言一、梯度替代二、网络结构三、MNIST分类1、单步模式2、多步模式 总结 前言 在SpikingJelly使用梯度替代训练SNN,构建单层全连接SNN实现MNIST分类任务。 一、梯度替代 1、梯度替代: 阶跃函数不可微,无法进行反向传播 g ( x ) …

miniTry:Python实现web搜索(全自动+程序操控)

声明:本问给出了全部代码--可以复现--亲测有效 :) [ 代码为图片--> 强制自己去敲一次 又不多] 1.打开网站: 2.利用id去定位到我们要进行输入的内容(bing可以直接进行搜索,而csdn需要登录,所以我们用csdn做演示&…

HODL、FUD、FOMO 等其他比特币俚语是什么意思?

作者:Paxful Team 1、FOMO(惧怕错失机会) FOMO 是惧怕错失机会的缩写,可用于日常生活。它指的是当其他人都在谈论比特币时,产生的购买比特币的紧迫感。 2、Shill(不断推广吹捧) Shilling 是指…

linux支持vGPU方案

1,查询gpu型号:lspci | grep "NVIDIA\|VGA" PCI Devices 2,下载驱动 官方驱动 | NVIDIA 3,安装 sudo sh NVIDIA-Linux-x86_64-440.118.02.run -no-x-check -no-nouveau-check -no-opengl-files参数说明: …

自定义View-旋转变色圆角三角形的绘制

本文字数:3151字 预计阅读时间:20分钟 在现代设计中,动效图在APP的UI界面中所起到的作用无疑是显著的。相比于静态的界面,动效更符合人类的自然认知体系,它有效地降低了用户的认知负载,UI动效俨然已经成为了…

汽车新四化,会发生什么?

北京国际汽车展览会正如火如荼地进行中,作为国内外汽车行业瞩目的盛会,众多车企纷纷亮出了自家的“杀手锏”。 这场汽车的盛宴不仅集中展示了众多汽车品牌的最新技术和产品,更深刻体现了汽车新四化的发展趋势。汽车新四化,即电动化、网联化、…

DS进阶:AVL树和红黑树

一、AVL树 1.1 AVL树的概念 二叉搜索树(BST)虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-…

使用Keil移植工程时修改单片机型号参数

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 当使用Keil对STM32系列单片机开发时,如果使用的是库函数,那么不同型号单片机的工程项目文件是可以直接移植的。只需要按照下面的步骤修改对应的芯片,就可以直接将工程移植过去&a…