Linux : Linux环境开发工具vim / gcc / makefile / gdb / git的使用

在这里插入图片描述

Linux环境开发工具的使用

  • 一、操作系统的生态
  • 二、程序下载安装
    • (一)程序安装方式
    • (二)包管理器 yum / apt 运行原理
  • 三、文本编辑器 vim
    • (一)认识vim 下的操作模式
    • (二)命令模式常用的快捷键
      • 1、移动光标
      • 2、删除内容
      • 3、复制粘贴
      • 4、 替换 / 撤销
    • (三)vim插件配置
  • 四、gcc 编译器的使用
    • (一)编译器的四个阶段
    • (二)动态链接和静态链接
      • 1、动态库和静态库
      • 2、动态链接和静态链接
  • 五、makeflie 自动化构建
    • (一)基本概念
    • (二)使用方式
      • 1、创建makefile语法
      • 2、创建一个通用性更强的makefile
  • 六、gdb 调试器
    • (一)release 和 debug
    • (二)gdb 的使用
    • (三)优化使用
  • 七、git 版本控制器
    • (一)基本使用方法
    • (二).gitignore 文件

一、操作系统的生态

学习linux,我们怎么衡量一个操作系统的好坏呢。操作系统的发展日新月异,过去的时间里诞生了很多操作系统。如今我们使用的centos, ubnutu或者像kali这样的操作系统都是大浪淘沙留下来的,都是基于linux开发。因此他们的差异不是来源于技术,而是来源于我们下面提到的生态。
在这里插入图片描述

  • 操作系统本身的质量: 首先一个操作系统要想得到发行推广,其本身的质量是根本保障。
  • 社区论坛: 如果一个操作系统是大公司使用,用户都是工程师、程序员,那么社区论坛肯定比较活跃,如果有问题上传论坛,就能及时的解答,因为别人在以后的工作中可能也会遇到。
  • 官方文档: 可以及时解决当下可能遇到的问题。
  • 更新速度: 一般来说,更新时间的快慢各有好处,更新的慢可以用来教学,更新的快可商用。

二、程序下载安装

(一)程序安装方式

linux中,一般来说有三种安装应用的方式。

  • 源代码:方式比较复制,可能需要配置文件或者需要其它的依赖程序。
  • rpm包:有时候需要其他的依赖程序
  • 包管理器安装:我们常用的安装方式使用这种方式,它可以把依赖程序一起安装。

(二)包管理器 yum / apt 运行原理

1、运行原理:
在这里插入图片描述

在这个流程中出现几个问题

  • 程序员为什么要主动开发: 一般来说有两类人会解决这个问题,首先就是“志愿者”纯粹的乐于助人,其次是操作系统的创造者,他们想要自己的操作系统有竞争力,就要不断地创作生产。
  • 发布后为什么操作系统公司会去生成软件包: 为了保持自己公司的竞争力,不被淘汰。
  • 上线后软件包用到的服务器谁提供: 市场中的大公司需求比较大的,他们会出钱提供服务器,一两万的服务器还不是手到擒来。
  • 用到的软件包在国外怎么解决下载速度: 因为操作系统的公司在国外,而受到墙的约束下载速度就会很慢,此时国内的公司就会提供镜像站,本质是将软件包拷贝了一份在镜像站里面。

2、yum 源:
yum 源是指我们使用yum时获取程序的地址,下面的指令中便是CentOS存放软件源的路径。
在这里插入图片描述
在上面的yum源中,最核心的是CentOS-Base.repo,打开后可以发现它的地址,一般都是国内的镜像站。
在这里插入图片描述
软件包在刚上线时肯定是不稳定的,因此我们有扩展软件源,等到时间的检验后才会将它放在稳定软件源里面。
在这里插入图片描述

三、文本编辑器 vim

(一)认识vim 下的操作模式

linux环境下,我们我们编写代码的工具是vim,这里我们经常使用的有三种模式分别是命令模式、插入模式和底行模式

  • 命令模式
    控制屏幕光标的移动,各种修改很多便捷方式。
  • 插入模式
    进行代码的编写,文本的修改。
  • 底行模式
    文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。
    在这里插入图片描述

(二)命令模式常用的快捷键

1、移动光标

  • vim可以直接用键盘上的光标来上下左右移动,但正规的vim是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格
  • 按「G」:移动到文章的最后
  • 按「 $ 」:移动到光标所在行的“行尾”
  • 按「^」:移动到光标所在行的“行首”
  • 按「w」:光标跳到下个字的开头
  • 按「e」:光标跳到下个字的字尾
  • 按「b」:光标回到上个字的开头
  • 按「#l」:光标移到该行的第#个位置,如:5l,56l
  • 按[gg]:进入到文本开始
  • 按[shift+g]:进入文本末端
  • 按「ctrl」+「b」:屏幕往“后”移动一页
  • 按「ctrl」+「f」:屏幕往“前”移动一页
  • 按「ctrl」+「u」:屏幕往“后”移动半页
  • 按「ctrl」+「d」:屏幕往“前”移动半页

2、删除内容

  • 「x」:每按一次,删除光标所在位置的一个字符
  • 「#x」:例如,「6x」表示删除光标所在位置的“后面(包含自己在内)”6个字符
  • 「X」:大写的X,每按一次,删除光标所在位置的“前面”一个字符
  • 「#X」:例如,「20X」表示删除光标所在位置的“前面”20个字符
  • 「dd」:删除光标所在行
  • 「#dd」:从光标所在行开始删除#行

3、复制粘贴

  • 「yw」:将光标所在之处到字尾的字符复制到缓冲区中。
  • 「#yw」:复制#个字到缓冲区
  • 「yy」:复制光标所在行到缓冲区。
  • 「#yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。
  • 「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完
    成复制与粘贴功能。

4、 替换 / 撤销

  • 「r」:替换光标所在处的字符。
    比特就业课
  • 「R」:替换光标所到之处的字符,直到按下「ESC」键为止。撤销上一次操作
  • 「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多次回
    复。
  • 「ctrl + r」: 撤销的恢复

(三)vim插件配置

四、gcc 编译器的使用

(一)编译器的四个阶段

1、预处理:
预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
通常情况下,条件编译的作用是是将应用划分成不同的版本。
在这里插入图片描述

2、编译:
在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,在检查无误后,gcc 把代码翻译成汇编语言
用户可以使用“-S”选项来进行查看,生成汇编代码。
在这里插入图片描述

3、汇编:
汇编阶段是把编译阶段生成文件转化为“.s”的二进制目标代码
在这里插入图片描述
二进制编译器 & 编译器的自举:
起初是没有汇编语言所写的编译器,后来通过编译器的自举生成汇编语言所写编辑器,那为什么后来的语言不分别来一个自举呢?因为汇编语言所写的就够用了,直接转换为汇编语言相当于站在巨人的肩膀上!
在这里插入图片描述

4、链接:
在成功编译之后,就进入了链接阶段,此时我们需要进行链接,直接使用gcc + XX.o
在这里插入图片描述

(二)动态链接和静态链接

1、动态库和静态库

引入:
我们的C程序没有定义printf的函数实现,预处理中包含的stdio.h中也只有该函数的声明,而没有定义函数的实现,那么程序是怎么跑起来的?
答案是:
系统把这些函数实现都被做到名为libc.so.6的库文件中去了,在没有特别指定时,gcc会到系统默认的搜索路径/usr/lib下进行查找,也就是链接到 libc.so.6库函数,而这也就是链接的作用。

函数库分为两种,动态库和静态库。

  • 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大。其后缀名一般为.a.
    在这里插入图片描述
  • 动态库由程序运行时,链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为.so.
    在这里插入图片描述

2、动态链接和静态链接

动态链接:
在形成.o文件后,默认通过gcc动态链接动态库生成可执行程序,如果后面动态库被删除了,此时程序就不能执行。
在这里插入图片描述
观察我们生成的动态链接可执行程序,发现系统中确实存在这个动态链接库,链接时通过后面的地址找到相应的函数。
在这里插入图片描述
使用指令file可以发现这里用到的是动态链接。
在这里插入图片描述

静态链接:
在链接时加入-static那么链接时就是静态链接,此时得到的文件内存上远远大于动态链接,但是好处是程序和库分离,这意味着删除库文件程序还能跑。
在这里插入图片描述
此时再使用ldd发现程序已经不是动态程序。
在这里插入图片描述
在这里插入图片描述

五、makeflie 自动化构建

(一)基本概念

写makefile是具备完成大型工程的能力的基础,一个工程中的源文件不数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作makefile带来的好处就是自动化编译

make是一个命令工具,是一个解释makefile中指令的命令工具,makefile是一个文件,两个搭配使用,完成项目自动化构建

(二)使用方式

1、创建makefile语法

  • (1)依赖关系和依赖方法:
    打开文件后第一行中是依赖关系,前者是需要生成的目标文件,后者是依赖文件,因此在依赖方法中会用后者生成前者
    在这里插入图片描述
    当依赖关系只是一个目标文件的时候,它的作用类似一条指令。
    在这里插入图片描述

  • (2)make执行方向:
    make会自顶向下扫描,默认生成第一个目标文件,如果指定生成,使用make mytest也能够完成。
    如果依赖文件不存在,那么makefile会自动向后面推导,他回去找生成依赖文件的其它语句,这个推导的过程类似一个栈
    在这里插入图片描述

  • (3)伪目标PHONY:
    如果我们的文件在进行编译一次之后,后面如果没有修改过源代码,那么再次编译时就不会成功。这是因为如果我们要编译大批代码,如果我们只修改其中的一部分,如果重新编译时每一个代码都重新进行编译,速度就会很慢,因此系统的这个方式起到提高效率的作用。
    在这里插入图片描述
    如果我们在依赖关系的上面添加PHONY后,后面再次编译就能通过。

PHONY原理:系统通过判断源文件和可执行程序的修改时间,判断是否需要重新编译,而PHONY的作用是这个时间忽视。

ACM时间:

  • 其中,当我们修改文件的内容后,它的文笔内容修改时间Modify和文本属性修改时间Change时间都会改变,因为改变文件后,通常会影响文件的属性,例如大小。
  • Access时间指的是打开文件的时间,通常访问几次文件才做更改。
    在这里插入图片描述

2、创建一个通用性更强的makefile

在前面的makefile的创建中,还是少了很多通用性,看不出明显的效率升级,下面我们创建的makefile可以编译当前目录的所有.c文件。
在这里插入图片描述

六、gdb 调试器

(一)release 和 debug

在我们使用gcc生成可执行程序时,可以生成两种版本的可执行程序。其中如果我们需要对代码进行调试或者测试,使用的是debug版本,因为gdb只能对这个版本进行调试。
在这里插入图片描述
观察这两个版本,可以发现debug内存信息相比于release较大

(二)gdb 的使用

linux下编程本质和曾经在vs编程功能差不多,下面我们学习的一些指令其实对应了这些在vs调试的功能。

  • list / l (行号/函数名): 显示源代码,接着上次的位置往下列,每次列10行

  • run / r: 运行程序。

  • next / n: 逐过程执行。

  • step / s: 逐语句执行。

  • break / b + (行号 / 函数名): 在指定位置设置断点。

  • info break : 查看断点信息。

  • finish: 跳出当前函数。

  • p 变量: 打印变量值。

  • set var: 修改变量的值。

  • continue / c: 跳跃到下一个断点位置。

  • delete breakpoints: 删除所有断点

  • delete breakpoints n: 删除序号为n的断点

  • disable breakpoints: 禁用断点

  • enable breakpoints: 启用断点

linux下的断点也是可以禁用的,禁用后使用continue将不会在断点处停下来。
在这里插入图片描述
其中,Enb指的就是断点是否被启用。

  • display 变量名: 跟踪查看一个变量,每次停下来都显示它的值
  • undisplay: 取消对先前设置的那些变量的跟踪
  • until X行号: 跳至X行
  • breaktrace(或bt): 查看各级函数调用及参数
  • info / i + locals: 查看当前栈帧局部变量的值
  • quit: 退出gdb

(三)优化使用

使用gdb还是有点不太友好,有没有简单好用一点的gdb推荐一下呢?有的兄弟!有的!使用cgdb可以使得我们在查看代码页面的同时还能看到我们调试命令栏。
在这里插入图片描述

七、git 版本控制器

git是一个去中心化,分布式的版本控制器。它既是一个本地windows下的软件,也是一个linux下的服务器。使用git,可以使得我们达到团队协作开发的效果,同时也可以使得数据更加安全不易丢失。

git在提交时,只会提交更改的部分,他会用字符串记录下更改操作,后续想要撤销直接对字符串操作即可。

(一)基本使用方法

  • git clone:
    将我们建立在git的仓库克隆到本地,我们可以在本地对仓库进行修改。
    在这里插入图片描述
    这样以来,本地就创建了这样一个文件夹test_bank
    在这里插入图片描述

  • git add:
    在本地做出修改之后,我们需要使用git add将修改的文件添加到缓冲区,此时还没有完成提交。
    在这里插入图片描述
    可以看到,我们在使用git add之后,再使用命令git status发现文件被滞留在了一个缓冲区的位置.

  • git commit:
    使用git commit才是彻底的完成了提交,此时我们在本地提交已经完成。
    在这里插入图片描述
    这里一定要有-m选项并介绍一下修改的内容,这样别人才能知道你干了什么,在团队协作时尤其重要。

  • git push:
    将远程和本地进行同步,此时远程仓库将会做出对应的修改。
    在这里插入图片描述
    在完成最后一步后,远程仓库才能正式的同步到我们本地的仓库。
    在这里插入图片描述

  • git pull:
    在多人协助开发时,可能我们的远程仓库已经被别人修改了,我们在提交时需要进行git pull同步一下远程仓库,再决定要不要提交修改。

(二).gitignore 文件

在我们的仓库列表中,存在一个隐藏文件gitignore,里面储存了很多种类型的文件的后缀,我们在将文件添加到缓冲区这个过程中带有这些后缀的文件将不被添加。
在这里插入图片描述

如果我们单单创建了一个文件夹,也不能够添加上去。

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

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

相关文章

国产游戏崛起,燕云十六移动端1.9上线,ToDesk云电脑先开玩

游戏爱好者的利好消息出新了!网易大型武侠仙游《燕云十六声》正式官宣,移动端要在1月9日正式上线了!你期待手游版的燕云吗?不妨评论区留言说说你的看法。小编分别花了几个小时在台式机电脑和手机上都试了下,欣赏画面还…

力扣刷题:数组OJ篇(下)

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 目录 1.轮转数组(1)题目描述…

有序数据中插入不确定数据保证数据插入的位置顺序正确排序

解决有序数据中插入不确定数据保证数据插入的位置顺序正确排序 前言 java 数据库中存储自增id 有序的数据, 前端页面基于 id 5和 6 之间新增一条数据,在 id 6 和 7之间新增 2条,或者更复杂的场景,后台接口如何保存数据使得页面数…

python无需验证码免登录12306抢票 --selenium(2)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 [TOC](python无需验证码免登录12306抢票 --selenium(2)) 前言 提示:这里可以添加本文要记录的大概内容: 就在刚刚我抢的票:2025年1月8日…

DNS协议漏洞利用实验_hust计算机网络安全实验

文章目录 计算机网络安全实验 DNS协议漏洞利用实验 docker使用 建立实验环境docker常用指令 一些注意事项设置本地 DNS 服务器 配置用户计算机设置本地DNS服务器在本地 DNS 服务器中建一个区域 修改主机文件(可略)netwox实施DNS的用户响应欺骗攻击netwo…

基于MP157AAA的I2C练习

练习要求: 通过I2C分别实现与芯片si7006(获取湿度、温度)和芯片ap3216(获取环境光照强度)的通讯; 1、运行效果 2、分析ap3216如何获取光照强度 2.1、需要操作的寄存器 通过分析手册,需要操作以下寄存器: 0x00:系统配置 0x0C&…

【Linux】深入理解文件系统(超详细)

目录 一.磁盘 1-1 磁盘、服务器、机柜、机房 📌补充: 📌通常网络中用高低电平,磁盘中用磁化方向来表示。以下是具体说明: 📌如果有一块磁盘要进行销毁该怎么办? 1-2 磁盘存储结构 ​编辑…

网络安全图谱以及溯源算法

​ 本文提出了一种网络攻击溯源框架&#xff0c;以及一种网络安全知识图谱&#xff0c;该图由六个部分组成&#xff0c;G <H&#xff0c;V&#xff0c;A&#xff0c;E&#xff0c;L&#xff0c;S&#xff0c;R>。 1|11.知识图 ​ 网络知识图由六个部分组成&#xff0c…

《Spring Framework实战》7:4.1.2.容器概述

欢迎观看《Spring Framework实战》视频教程 容器概述 该接口表示 Spring IoC 容器&#xff0c;并负责实例化、配置和组装 bean。 容器在组件上获取其指令&#xff0c;以实例化、配置和 通过读取配置元数据进行汇编。可以表示配置元数据 作为带注释的组件类、具有工厂方法的配置…

学生公寓技术规格书如何编写?

学生公寓限电柜的技术规格书主要包括以下内容‌&#xff1a; ‌用电计量计费‌&#xff1a;限电柜可以通过计算机售电管理系统进行用电计量计费&#xff0c;学生需要预交电费&#xff0c;系统会自动将数据传给控电柜和配电箱&#xff0c;对宿舍的电量进行累减计量‌。 ‌时间控…

【HarmonyOS NEXT】鸿蒙应用点9图的处理(draw9patch)

【HarmonyOS NEXT】鸿蒙应用点9图的处理&#xff08;draw9patch&#xff09; 一、前言&#xff1a; 首先在鸿蒙中是不支持安卓 .9图的图片直接使用。只有类似拉伸的处理方案&#xff0c;鸿蒙提供的Image组件有与点九图相同功能的API设置。 可以通过设置resizable属性来设置R…

SpringBoot 使用 Cache 集成 Redis做缓存保姆教程

1. 项目背景 Spring Cache是Spring框架提供的一个缓存抽象层&#xff0c;它简化了缓存的使用和管理。Spring Cache默认使用服务器内存&#xff0c;并无法控制缓存时长&#xff0c;查找缓存中的数据比较麻烦。 因此Spring Cache支持将缓存数据集成到各种缓存中间件中。本文已常…

MySQL事件功能简介

MySQL 的事件调度器&#xff08;Event Scheduler&#xff09;提供了一种便捷的方法来定时执行 SQL 语句&#xff0c;从而实现数据维护、报告生成等自动化操作。本文将详细介绍 MySQL 的事件功能&#xff0c;并说明如何使用 Navicat 管理这些事件。 1. 什么是 MySQL 事件调度器…

高光谱相机的特点

光谱特性 高光谱分辨率&#xff1a;能将光谱范围分割成极窄的波段&#xff0c;光谱分辨率通常达到纳米级甚至亚纳米级&#xff0c;可精确捕捉到不同物质在细微光谱差异上的特征&#xff0c;比如可以区分不同种类的植被因叶绿素含量等差异而在光谱上的细微变化。 多波段探测&a…

备考蓝桥杯:数据结构概念浅谈

目录 1数据结构的概念 什么是数据结构: 为什么要有数据结构 2.数据结构的三个组成要素 1.逻辑结构 2.存储结构 3.数据运算 3。算法好坏的度量&#xff08;时间复杂度和空间复杂度&#xff09; 时间复杂度计算 最优和平均和最差时间复杂度 计算时间复杂度例子 空间复…

闲谭SpringBoot--ShardingSphere分库分表探究

文章目录 1. 背景2. 创建数据库3. 修改yml配置文件4. 分片算法类5. 测试6 小结 1. 背景 接上文&#xff0c;我们对日志表&#xff0c;进行了按月的分表&#xff0c;这样每个月几百万条数据量还是扛得住的。 但是如果数据再多呢&#xff0c;除了提高硬件性能&#xff0c;还有一…

基于伪分布式模式部署Hadoop集群

1.上传Hadoop安装包 在/export/software目录下使用rz命令上传Hadoop安装包 2.创建目录 在/export/servers目录下创建wfb-hadoop目录&#xff0c;用于存放Hadoop的安装目录&#xff0c;命令如下&#xff1a; mkdir -p /export/servers/wfb-hadoop 3.安装Hadoop 1)将Hadoop安…

Android车载音频系统目录

目录 第一章 1.1 Android Automotive&#xff08;一&#xff09; 1.2 Android Automotive&#xff08;二&#xff09; 1.3 Android Automotive&#xff08;三&#xff09; 第二章 2.1 Android车载音频系统概览 2.2 车载音频焦点 2.3 车载音频配置 2.4 Audio control HAL…

怎么管理电脑usb接口,分享四种USB端口管理方法

怎么管理电脑usb接口&#xff0c;分享四种USB端口管理方法 USB接口作为电脑重要的外部接口&#xff0c;方便了数据传输和设备连接。 然而&#xff0c;不加管理的USB接口也可能带来安全隐患&#xff0c;例如数据泄露、病毒传播等。 因此&#xff0c;有效管理电脑USB接口至关重…

React+redux项目搭建流程

1.创建项目 create-react-app my-project --template typescript // 创建项目并使用typescript2.去除掉没用的文件夹&#xff0c;只保留部分有用的文件 3.项目配置&#xff1a; 配置项目的icon 配置项目的标题 配置项目的别名等&#xff08;craco.config.ts&…