[linux长征路第四篇]开发工具vim的使用gcc/g++的使用

小白又菜 小白又菜     2022-12-02     360

关键词:


1.Linux下软件包管理器yum

在Linux下软件的安装,软件的卸载在Linux下该做呢?

在centos 7中有三种安装方式:1.源码安装 2.rpm包安装 3.yum安装 

1.1 什么是软件包

  • 在Linux下安装软件, 一个通常的办法是下载到程序的源代码(源码安装), 并进行编译, 得到可执行程序.
  • 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.(rpm安装)
  • 软件包和软件包管理器, 就好比 "App" 和 "应用商店" 这样的关系.
  • yum(Yellow dog Updater, Modifified)是Linux下非常常用的一种包管理器. 主要应用在Fedora, RedHat, Centos等发行版上.(yum安装)

yum安装的好处:

1、不用编译源码

2、不用解决软件的依赖关系

1.2如何安装软件

通过 yum, 我们可以通过很简单的一条命令完成sl的安装(在root用户下执行)

yum install sl

yum 会自动找到都有哪些软件包需要下载, 这时候敲 "y" 确认安装.

出现 "complete" 字样, 说明安装完成.

注意事项:

  • 安装软件时由于需要向系统目录中写入内容, 一般需要 sudo 或者切到 root 账户下才能完成.
  • yum安装软件只能一个装完了再装另一个. 正在yum安装一个软件的过程中, 如果再尝试用yum安装另外一个软件, yum会报错.

yum使用举例

在xshell输入sl可出现一个火车头。如果我们没有安装sl的话可以进行安装(切换成root用户):yum install sl

[

[

[

[

通过这个例子我们知道如果要在Linux下安装什么软件,使用yum可以很简单。

 

1.3 如何卸载软件 

仍然使用一条指令,假设我们要删除刚刚删掉的sl软件(切换到root用户)

yum remove ls

[

[


2. vim使用

2.1 vim的安装和配置

vim的安装,切换到root账户下输入命令即可安装

yum install -y vim

安装好之后,大家可以赋值下面链接输入到命令行,配置vim(自动补齐,高光,自动纠错等)

curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh

[

 下载完成后按照提示输入指定命令即可使vim配置生效!

[

[

[

[

 

 

2.2 vim的基本概念

vim是一个编辑器,它能用来写代码并且功能强大(多模式的编辑器)

vim的三种模式(其实有好多模式,目前掌握这3种即可),分别是命令模式(command mode)、

入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:

正常/普通/命令模式(Normal mode)

控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode

插入模式(Insert mode)

只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。

末行模式(last line mode)

文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+: 即可进入该模式。要查看你的所有模式:打开vim,底行模式直接输入 :help vim-modes

2.3 vim的基本操作

如何进入vim,输入vim 及文件名称即可。就进入全屏幕编辑画面

vim test.c

[

[

当我们进入vim后,是处于命令模式,在命令模式中你在键盘输入一些字符是毫无效果的,要切换到插入模式才能输入文字

命令模式切换至插入模式

 

  • 按「i」切换进入插入模式「insert mode」,按“i”进入插入模式后是从光标当前位置开始输入文件;
  • 按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;
  • 按「o」进入插入模式后,是插入新的一行,从行首开始输入文字

[

[

写完代码了再从插入模式切换至正常模式


按一下「ESC」键转到[正常模式]

[

[

 写完代码之后想要退出vim该如何做呢?

此时要从命令模式切换至底行模式:shift + ; 其实就是输入 :

[

[

退出vim及保存文件,在底行模式中输入wq,也有不同的选项

:w (保存当前文件)


:wq (输入「wq」,存盘并退出vim)


:q! (输入q!,不存盘强制退出vim)

[

[

退出后我们输入cat 文件名可以查看刚刚我们所写的代码

[

[

 

3.  vim正常模式命令集

3.1 插入模式

  • 按「i」切换进入插入模式「insert mode」,按“i”进入插入模式后是从光标当前位置开始输入文件;
  • 按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;
  • 按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。

这个大家可自行验证 

3.2 命令模式下的文本批量化操作

  • yy:复制当前行  nyy:复制多行
  • p :   粘贴
  • dd : 剪切(删除)当前行,ndd
  • u : 撤销
  • ctrl + r  :针对u操作再次进行撤销(恢复刚刚的撤销)
  • shift + g :G 光标快速定位到最后一行
  • gg :快速将光标定位到第一行
  • n + shift + g  : 光标快速定位到文本的第 n  行
  • shift + 4: $ 光标快速定位到文本行的末尾
  • shift + 6 :^ 光标快速定位到文本行的开头
  • w ,b :向后,向前在一行以单位为单位移动
  • h,j,k,l :光标向左,下,上,右移动
  • shift + ` : ~ 大小写快速切换
  • r + 替换字母:替换光标所在的字符 支持nr
  • shift + r :R替换模式,批量化替换
  • x :删除光标所在的字符,支持nx 批量化删除

以上操作大家可自行验证

4. Linux编辑器 -gcc/g++使用

4.1 gcc如何完成

格式 gcc [选项] 要编译的文件 [选项] [目标文件]

我们刚才所写的test.c已经完成了,那我们如何进行编译呢?我们使用gcc 文件名。

输入 ./a.out 执行结果

[

[

gcc test.c -o mytest  //指定名称

[

 

[

[

 

 4.2  gcc 翻译过程

在C语言中,我们知道一个程序要被执行要经过4个阶段。分别是预处理,编译,汇编,链接

在VS下,我们无法直接查看每一个阶段所做的工作,我们只知道预处理可能做了宏替换,去注释等,在gcc编译器下,我们可以进行查看。

4.2.1 预处理

  1.  预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
  2. 预处理指令是以#号开头的代码行。
  3. 实例: gcc –E hello.c –o hello.i
  4. 选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
  5. 选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序图像 小部件

首先我们来写一部分代码,在Linux下查看一下预处理过程的结果 

 

[

[

gcc -E test.c -o test.i

[

 -E :从现在开始进行程序的翻译,当预处理完成时,就停下来

 

[

[

此时我们想要查看预处理的结果 vim打开test.c

 

[

[

 当我们进入test,i后 shift + g 直接闪现到最后一行发现 预处理结果确实进行了头文件的展开,宏替换,去注释,条件编译等等

 

[

[

 

4.2.2  编译(生成汇编)

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

用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码

预处理完成后想要在编译结束后停下来输入

gcc -S test.i -o test.s

[

-S:从现在开始进行程序的翻译,当我们编译完成后就停下来

 

[

[

我们进入test.s发现代码行数已经变得非常少了,其实这已经变成了x86环境下的汇编指令

 

[

[

4.2.3 汇编

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

读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了

gcc -c test.s -o test.o

[

-c :从现在开始进行程序的翻译,当我们汇编完成后就停下来

[

[

此时我们进入test.o发现已经变成了二进制文件

 

[

[

4.2.4 链接

在成功编译之后,就进入了链接阶段。

gcc test.o -o test

[

    [

    [


4.3 函数库

  • 我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而 没有定义函数的实现,那么,是在哪里实“printf”函数的呢?
  • 最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到 系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用

4.3.1 函数库的分类

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

静态库:

静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”

动态库:

动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。 gcc hello.o –o hello

gcc默认生成的二进制程序,是动态链接的

(本篇完)


[linux长征路第六篇]linux使用git上传gitee三板斧

 1.git是什么?git是一个版本控制器。这样说我们暂时可能无法理解,我们现在可以理解为版本控制器类似于百度云盘。2.使用git2.1安装git我们直接是用yum命令安装gityuminstallgit2.2在Gitee上创建项目​​Gitee官方网站​​2.2.1使用G... 查看详情

[linux长征路第一篇]基本指令

从今天开始我会持续更新我学习Linux的学习笔记。今天主要学习Linux下基本指令。1.Linux下基本指令1.为什么要进行指令操作?因为指令距离OS更近,便于我们更好的掌握OS。指令操作对于非专业人员来说没有必要学习,对于专业人员... 查看详情

开始写游戏---第四篇

开始写游戏---第四篇    今天完成了商店的物品展示功能。  写了一个物品展示面板组件:      这是代码:      使用的时候这么使用:          额。。。感觉使用有点麻烦,我又提供了... 查看详情

linux从青铜到王者第二十四篇:linux网络基础第四篇之websocket协议(代码片段)

系列文章目录文章目录系列文章目录前言一、WebSocket简介二、WebSocket产生背景三、WebSocket实现原理四、WebSocket协议举例五、WebSocket使用1.WebSocket介绍2.WebSocketAPI3.WebSocket事件1.open2.Message3.Error4.Close4.WebSocket方法1.send()2.close()5.WebSocket... 查看详情

构建之法第四篇读后感

只有先清楚自己的用户是怎样的,才能编出一个好软件,而其中,典型用户和典型场景的分析非常重要。用例也是很常用的需求分析工具,包括以下四个基本要素:标题,角色,主要成功场景,扩展场景等。而使用用例的原则主... 查看详情

第四篇:韦东山教程需安装的驱动和软件

目录一、eop烧写器驱动安装二、oflash烧写软件安装三、串口工具(MobaXterm_Portable_v10.4.exe)四、uboo通过USB烧写程序需安装的驱动和软件五、hex文件编辑器安装一、eop烧写器驱动安装?1)使用教程中制作好的驱动?工具与驱动——>... 查看详情

转载gradleforandroid第四篇(构建变体)

当你在开发一个app,通常你会有几个版本。大多数情况是你需要一个开发版本,用来测试app和弄清它的质量,然后还需要一个生产版本。这些版本通常有不同的设置,例如不同的URL地址。更可能的是你可能需要一个免费版和收费... 查看详情

第四篇:记录相关操作(代码片段)

一介绍MySQL数据操作:DML========================================================在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括使用INSERT实现数据的插入UPDATE实现数据的更新使用DELETE实现数据的删除使用SELECT查询数据... 查看详情

java后端开发第四篇:springboot中thymeleaf入门(代码片段)

thymeleaf是springboot中所支持的一种模板引擎。入门级使用如下:pom.xml中引入依赖:<!--引入模板引擎--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thy 查看详情

eclipse插件开发学习笔记pdf第一篇到第四篇免分下载开发基础核心技术高级进阶综合实例

<<Eclipse插件开发 学习笔记>>,本书由浅入深、有重点、有针对性地介绍了Eclipse插件开发技术,全书分为4篇共24章。第一篇介绍Eclipse平台界面开发的基础知识。包含SWT控件的使用、界面布局、事件处理等内容;第二... 查看详情

css样式第四篇

?针对现在网站的图片过大问题,可以用相应的工具进行压缩,并且可对图片进行切割处理。1.如果一个页面的图片过大,可以对其切割,代码<imgsrc=”1.jpg”><imgsrc=”2.jpg”><imgsrc=”3.jpg”>,如这样排列的图片不是块... 查看详情

coreanimation文档翻译(第四篇)

CoreAnimation文档翻译(第四篇)让Layer的content动画起来核心动画的基础接口以及为拥有Layer的View做的动画扩展接口,使得为Layer制作复杂动画变得简单化。例如改变Layer的frame的size、改变Layer在屏幕上的position、应用旋转transform、或... 查看详情

第四篇alexnet——网络实战

文章目录摘要1项目结构2划分训练集和测试集3计算mean和Standard3.1标准化的作用3.2归一化的作用4训练4.1导入项目使用的库4.2设置随机因子 查看详情

第四篇alexnet——网络实战

文章目录摘要1项目结构2划分训练集和测试集3计算mean和Standard3.1标准化的作用3.2归一化的作用4训练4.1导入项目使用的库4.2设置随机因子 查看详情

flask第四篇使用flask的扩展实现简单页面登录功能

fromflaskimportFlask,render_template,request,redirect,sessionapp=Flask(__name__,template_folder=‘templates‘)app.secret_key="sdsfdsgdfgdfgfh"@app.before_requestdefprocess_request():ifrequest.path=="/lo 查看详情

第四篇阅读笔记

   每个开发组都应该形成并制定一套工作习惯。在将大家集中在一起时,首先制定一份粗略的系统功能图,方便大家对于该系统形成一个统一的共识,制定详细的用例视图。        用例的来源庞... 查看详情

第四篇:“不确定"限制值的使用

前言    前篇文章解释了限制值的五种类型以及获取它们的方法。但是对于其中可能不确定的类型(45类型),当限制值获取函数返回-1的时候,我们无法仅通过这个函数返回值-1来判断是限制值获取失败还是限制值是... 查看详情

redis第四篇——缓存

这一篇和Redis本身关系不大,而是我们在日常将Redis作为缓存使用时会遇到的几个问题缓存穿透关键点:访问一个不存在的key。当请求一个不存在的key时,缓存就没用了,这样每次请求都直接打到我们后台的DB解决... 查看详情