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的简单使用方法!
在这里插入图片描述
谢谢大家支持本篇到这里就结束了
在这里插入图片描述

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

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

相关文章

html表格导出为word文档,导出的部分表格内无法填写文字

导出技术实现:fileSaver.jshtml-docx-js 1.npm安装 npm install --save html-docx-js npm install --save file-saver 2.页面引入 import htmlDocx from html-docx-js/dist/html-docx; import saveAs from file-saver;components: {htmlDocx,saverFile, }, 3.页…

神经网络的激活函数

目录 神经网络 激活函数 sigmoid 激活函数 tanh 激活函数 backward方法 relu 激活函数 softmax 激活函数 神经网络 人工神经网络( Artificial Neural Network, 简写为ANN)也简称为神经网络(NN)&#xff0c…

提示工程 3—文本类任务和推理类任务示例

1. 文本类任务 1.1. 文本概括(Text Summarization) 任务描述:将较长的中文文本内容简化为包含关键信息和主要观点的简短版本。 示例:原文:"阿里巴巴集团成立于1999年,是中国最大的电子商务公司之一,由马云创办。集团主要经营B2B、B2C和C2C等多种电商平台。"…

k8s笔记 | StatefulSet 有状态

创建一个web.yaml --- apiVersion: v1 kind: Service metadata:name: nginxlabels:app: nginx spec:ports:- port: 80name: webclusterIP: Noneselector:app: nginx --- apiVersion: apps/v1 kind: StatefulSet metadata:name: web spec:serviceName: "nginx" # 使用…

c# ?? 、?.、??=、?[]运算符的使用

在 C# 中存在一些特殊的运算符,它们简化了代码的编写,主要用于处理空值(null)或简化成员访问。以下是一些常用的这类运算符: ?? - Null 合并运算符 Null 合并运算符 ?? 在左侧的操作数不为 null 时返回左侧的操作…

asp.net core 自定义过滤器 注入的几种方式和实现

在 ASP.NET Core 中,过滤器(Filters)是一种在 MVC 应用程序中运行代码的方法,可以在操作(Actions)执行之前或之后运行。过滤器可以应用于控制器(Controllers)或特定的操作方法。过滤…

Java-基础知识-包-带点不带点

在 IntelliJ IDEA 中,工程目录(通常指的是项目的包结构或目录结构)带点和不带点的区别主要是语义上的和约定上的。这里所说的“点”通常指的是在包名或目录名中的.字符。 带点的目录结构: 当您在 IntelliJ IDEA 中看到带点的目录…

Netty 应用与原理

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 Java IO 模型 本篇示例代码仓库:learn-netty 基础概念 在 I/O 操作中有这么两组概念,其中同步/异步 要和线程中的同步线程/异步线程要区分开,这里指的是同步IO / 异步IO…

安全作业-1

1. windows登录的明文密码,存储过程是怎么样的,密文存在哪个文件下,该文件是否可以打开,并且查看到密文 用户在登录界面输入用户名和密码。Windows登录进程(winlogon.exe)接收用户的输入,并准备进行身份验证。Lsass处…

人脸识别开发项目汇总

1.基于FaceX-Zoo实现的人脸识别系统-CSDN博客 2.人脸识别:京东开源FaceX-Zoo:PyTorch工具箱 - 知乎 (zhihu.com) 3.人头识别-人群中准确快速的检测头部算法_在输入图像中检测人像头部的方法-CSDN博客 4.Github开源人脸识别项目face_recognition - 知乎…

ssm智能停车场管理系统

视频演示效果: SSMvue智能停车场 摘 要 本论文主要论述了如何使用JAVA语言开发一个智能停车场管理系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述智能停车…

Langchain实战:基于Chain实现Prompt的高级应用

Langchain实战 一. Langchain介绍二. 项目背景三. 代码实现3.1 导入必要的库并调用GPT大模型3.2 输出解析器(指定输出格式)3.3 定义Prompt模板3.4 构造LLMChain并推理3.5 解析推理结果3.6 异步调用 四. 参考文献 一. Langchain介绍 LangChain 是一个用于开发由语言模型驱动的应…

新兴游戏引擎Godot vs. 主流游戏引擎Unity和虚幻引擎,以及版本控制工具Perforce Helix Core如何与其高效集成

游戏行业出现一个新生事物——Godot,一个免费且开源的2D和3D游戏引擎。曾经由Unity和虚幻引擎(Unreal Engine)等巨头主导的领域如今迎来了竞争对手。随着最近“独特”定价模式的变化,越来越多的独立开发者和小型开发团队倾向于选择…

Vitis HLS 学习笔记--Syn Report解读(1)

目录 1. 介绍 2. 示例一 2.1 HLS 代码 2.2 Report 解读 2.2.1 General Information 2.2.2 Timing Estimate 2.2.3 Performance & Resource Estimates 2.2.4 HW interfaces 2.2.4.1 硬件接口报告 2.2.4.2 导出至 Vivado 中的 IP 2.2.4.3 Port-Level Protocols 端…

掌握Unix路径简化:五种有效算法比较【python力扣71题】

题目描述 给你一个字符串 path,表示一个 Unix 风格的绝对路径,请你简化它并返回。 Unix 风格的绝对路径中,.. 表示返回上一级目录,. 表示当前目录。简化路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜…

图形化编程要怎么做

0. 简介 Scratch其实应该算得上最早做图形化编程的工程了。Scratch 是麻省理工学院的“终身幼儿园团队”在 2007 年 [5]发布的一种图形化编程工具,主要面对全球青少年开放,是图形化编程工具当中最广为人知的一种,所有人都可以在软件中创作自…

排序算法-计数排序

一、计数排序 这种排序算法 是利用数组下标来确定元素的正确位置的。 如果数组中有20个随机整数,取值范围为0~10,要求用最快的速度把这20个整数从小到大进行排序。 很大的情况下,它的性能甚至快过那些时间复杂度为O(nlogn)的排序。…

【React】Sigma.js框架网络图-入门篇(2)

通过《【React】Sigma.js框架网络图-入门篇》有了基本认识 由于上一篇直接给出了基本代码示例,可能看着比较复杂也不知道是啥意思; 今天从理论入手重新认识下! 一、基本认识 首先,我们先了解下基础术语: 图(Graph)&…

python coverage如何使用

Python的coverage.py是一个测量代码覆盖率的工具,它可以告诉你在测试中哪些代码被执行了,哪些没有。这对于确保你的测试覆盖了所有情况非常有用。以下是如何使用coverage.py的基本步骤: ### 安装 首先,你需要安装coverage.py。你…

如何实现直播声卡反向给手机充电功能呢?

在数字化时代的浪潮中,声卡作为多媒体系统的核心组件,扮演着声波与数字信号相互转换的关键角色。它不仅能够将来自各类音源的原始声音信号转换为数字信号,进而输出到各类声响设备,更能够通过音乐设备数字接口(MIDI)发出合成乐器的…