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,里面储存了很多种类型的文件的后缀,我们在将文件添加到缓冲区这个过程中带有这些后缀的文件将不被添加。
在这里插入图片描述

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

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

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

相关文章

HTML5 网站模板

HTML5 网站模板 参考 HTML5 Website Templates

怎么抓取ios 移动app的https请求?

怎么抓取IOS应用程序里面的https? 这个涉及到2个问题 1.电脑怎么抓到IOS手机流量? 2.HTTPS怎么解密? 部分app可以使用代理抓包的方式,但是正式点的app用代理抓包是抓不到的,例如pin检测,证书双向校验等…

记录一下vue2项目优化,虚拟列表vue-virtual-scroll-list处理10万条数据

文章目录 封装BrandPickerVirtual.vue组件页面使用组件属性 select下拉接口一次性返回10万条数据,页面卡死,如何优化??这里使用 分页 虚拟列表(vue-virtual-scroll-list),去模拟一个下拉的内容…

【芯片封测学习专栏 -- D2D 和 C2C 之间的区别】

请阅读【嵌入式开发学习必备专栏 Cache | MMU | AMBA BUS | CoreSight | Trace32 | CoreLink | ARM GCC | CSH】 文章目录 OverviewD2D(Die-to-Die)互联D2D 定义D2D 特点D2D 使用场景 C2C(Chip-to-Chip)互联C2C 定义C2C 特点C2C 使…

使用网页版Jupyter Notebook和VScode打开.ipynb文件

目录 正文 1、网页版Jupyter Notebook查看 2、VScode查看 因为总是忘记查看文件的网址,收藏了但分类众多每次都找不到……当个记录吧(/捂脸哭)! 正文 此处以gitub中的某个仓库为例: https://github.com/INM-6/mu…

Qt监控系统远程网络登录/请求设备列表/服务器查看实时流/回放视频/验证码请求

一、前言说明 这几个功能是近期定制的功能,也非常具有代表性,核心就是之前登录和设备信息都是在本地,存放在数据库中,数据库可以是本地或者远程的,现在需要改成通过网络API请求的方式,现在很多的服务器很强…

企业级PHP异步RabbitMQ协程版客户端 2.0 正式发布

概述 workerman/rabbitmq 是一个异步RabbitMQ客户端,使用AMQP协议。 RabbitMQ是一个基于AMQP(高级消息队列协议)实现的开源消息组件,它主要用于在分布式系统中存储和转发消息。RabbitMQ由高性能、高可用以及高扩展性出名的Erlan…

百度视频搜索架构演进

导读 随着信息技术的迅猛发展,搜索引擎作为人们获取信息的主要途径,其背后的技术架构也在不断演进。本文详细阐述了近年来视频搜索排序框架的重大变革,特别是在大模型技术需求驱动下,如何从传统的多阶段级联框架逐步演变为更加高…

31_搭建Redis分片集群

Redis的主从复制模式和哨兵模式可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:海量数据存储问题、高并发写的问题。由于数据量过大,单个master复制集难以承担,因此需要对多个复制集进行集群,形成水平扩展每个复制集只负责存储整个数据集的一部分,这就是Red…

如何用 ESP32-CAM 做一个实时视频流服务器

文章目录 ESP32-CAM 概述ESP32-S 处理器内存Camera 模块MicroSD 卡槽天线板载 LED 和闪光灯其他数据手册和原理图ESP32-CAM 功耗 ESP32-CAM 引脚参考引脚排列GPIO 引脚哪些 GPIO 可以安全使用?GPIO 0 引脚MicroSD 卡引脚 ESP32-CAM 的烧录方式使用 ESP32-CAM-MB 编程…

LS1046+XILINX XDMA PCIE调通

欢迎点赞收藏,欢迎私下讨论技术,分享技术 硬件平台 :NXP LS1046 XILINX FPGA 软件平台:LINUX 4.19.68 buildroot LS1046 PEX3 接 XILINX FPGA,linux使用designware的PCI主控制器。下载XILINX DMA驱动,解…

golang常用标准库

输入与输出-fmt包时间与日期-time包命令行参数解析-flag包日志-log包IO操作-os包IO操作-bufio包与ioutil包strconv包模板-template包http包contextjson/xmlreflect反射官方标准库 输入与输出-fmt包 输入与输出 常用输出函数 Print、Printf、Println:直接输出内容 Sp…

【物联网原理与运用】知识点总结(上)

目录 名词解释汇总 第一章 物联网概述 1.1物联网的基本概念及演进 1.2 物联网的内涵 1.3 物联网的特性——泛在性 1.4 物联网的基本特征与属性(五大功能域) 1.5 物联网的体系结构 1.6 物联网的关键技术 1.7 物联网的应用领域 第二章 感知与识别技术 2.1 …

macOS 安装tomcat9

macOS 安装tomcat9 URL:https://tomcat.apache.org/download-90.cgi 解压之后放到指定目录 /Users/lanren/install/tomcat-9 自己取个名字就行 给权限: ① 先进行权限修改:终端输入sudo chmod 755 /Users/lanren/install/tomcat-9/bin/…

基于STM32的智能家居蓝牙系统(论文+源码)

1总体方案设计 本次基于STM32的智能家居蓝牙系统,其系统总体架构如图2.1所示,采用STM32f103单片机作为控制器,通过DHT11传感器实现温湿度检测,MQ-2烟雾传感器实现烟雾检测,光敏电阻实现光照检测,同时将数据…

Ubuntu 磁盘修复

Ubuntu 磁盘修复 在 ubuntu 文件系统变成只读模式,该处理呢? 文件系统内部的错误,如索引错误、元数据损坏等,也可能导致系统进入只读状态。磁盘坏道或硬件故障也可能引发文件系统只读的问题。/etc/fstab配置错误,可能…

Android系统定制APP开发_如何对应用进行系统签名

前言 当项目开发需要使用系统级别权限或frame层某些api时,普通应用是无法使用的,需要在AndroidManifest中配置sharedUserId: AndroidManifest.xml中的android:sharedUserId“android.uid.system”,代表的意思是和系统相同的uid&a…

【MySQL】DATEDIFF()函数使用

DATEDIFF 函数用于计算两个日期之间的差值,以天为单位 DATEDIFF 函数返回一个整数,表示 date1 和 date2 之间的天数。如果 date1 在 date2 之前,结果为负数;如果在 date2 之后,结果为正数;如果相等&#xf…

yum系统报错:SyntaxError: multiple exception types must be parenthesized

执行yum相关步骤报错如下: File "/usr/bin/yum", line 30except KeyboardInterrupt, e:^^^^^^^^^^^^^^^^^^^^ SyntaxError: multiple exception types must be parenthesized原因:python解释器版本错误,yum运行版本为python 2.7&am…

MapReduce完整工作流程

1、mapreduce工作流程(终极版) 0. 任务提交 1. 拆-split逻辑切片--任务切分。 FileInputFormat--split切片计算工具 FileSplit--单个计算任务的数据范围。 2. 获得split信息和个数。 MapTask阶段 1. 读取split范围内的数据。k(偏移量)-v(行数据) 关键API:TextI…