Linux工具【1】(编辑器vim、编译器gcc与g++)

vim详解

  • 引言
  • vim
    • Vim的三种模式及模式切换
    • 普通模式下操作
    • 底行模式下操作
  • gcc与g++
    • gcc的使用(g++类似)
      • 预编译
      • 编译
      • 汇编
      • 链接
      • 静态库与动态库
  • 总结

引言

vim(vi improved)编辑器是从 vi 发展出来的一个文本编辑器。 代码补全、编译及错误跳转、语法高亮等方便编程的功能特别丰富,在程序员中被广泛使用。
vim 可以说是程序开发者的一项很好用的工具,它更是一个程序开发工具而不只是文字处理软件。

在这里插入图片描述
在vim中编辑代码可以使程序员的手指集中在键盘中央,从而提高效率。

在vim中编辑代码后,要执行代码就需要编译器,在Linux中使用gccg++编译C与C++代码

vim

为方便演示,我们touch一个test_vim.c文件,并使用vim 文件名以vim方式打开这个文件
在这里插入图片描述

Vim的三种模式及模式切换

vim编辑器有许多模式,在这里只介绍三种常用的模式:命令(普通)模式Normal mode、底行模式Last line mode、插入模式Insert mode

在这里插入图片描述
命令模式(Normal mode)
控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入到Insert mode或者到 last line mode下:

使用vim 文件名 打开后的状态就是命令(正常)模式:
在这里插入图片描述

插入模式(Insert mode)
只有在Insert mode下,才可以做文字输入,是使用的最频繁的编辑模式。在命令模式下按i即可进入该模式,按Esc键可回到命令行模式:
在这里插入图片描述
这个模式中可以正常编辑代码,就不赘述了。

末行模式(last line mode)
文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下按: 即可进入该模式,按Esc键可回到普通模式:
在这里插入图片描述

普通模式下操作

由于空文件下无法观察普通模式的操作,所以先使用插入模式在test_vim.c文件中输入一些内容
在这里插入图片描述

常用命令:

  1. 移动光标
    小写英文字母hjkl,分别控制光标左、下、上、右移一格:
    G:移动到文章的最后
    $ :移动到光标所在行的“行尾”
    ^:移动到光标所在行的“行首”
    w:光标跳到下个字的开头
    e:光标跳到下个字的字尾
    b:光标回到上个字的开头
    #l:光标移到该行的第#个位置
    gg:进入到文本开始
    ctrl + b:屏幕向后移动一页
    ctrl + f:屏幕向前移动一页
    ctrl + u:屏幕向后移动半页
    ctrl + d:屏幕向前移动半页
    (移动光标的命令就不举例使用了)

  2. 删除文字
    x:每按一次,删除光标所在位置的一个字符
    #x:表示删除光标所在位置的后(包含自己在内)#个字符
    X:每按一次,删除光标所在位置的前一个字符
    #X:表示删除光标所在位置的前#个字符
    dd:删除光标所在行
    #dd:从光标所在行开始删除#行
    在这里插入图片描述

  3. 复制
    yw:将光标所在之处到字尾的字符复制到缓冲区中
    #yw:复制#个字到缓冲区
    yy:复制光标所在行到缓冲区。
    #yy:表示拷贝从光标所在行向下#行文字
    p:将缓冲区内的字符贴到光标所在位置
    需要注意的是:所有与y有关的复制命令都必须与p配合才能完成复制与粘贴功能
    在这里插入图片描述

  4. 替换
    r:替换光标所在处的字符。
    R:替换光标所到之处的字符,直到按下Esc键为止。
    在这里插入图片描述

  5. 撤销上一次操作
    u:回到上一个操作,按多次可以执行多次回复
    ctrl + r: 撤销的恢复

  6. 更改
    cw:更改光标所在处的字到字尾处
    c#w:表示更改#个字符

  7. 跳至指定的行
    ctrl+g: 列出光标所在行的行号
    #G:表示移动光标至文章的第#行行首

底行模式下操作

常用命令:

  1. 列出行号
    set nu: 在文件中的每一行前面列出行号。
    (我使用的vim环境已经是配置过的,所以会默认显示行号)

  2. 跳到文件中的某一行
    #:跳到第#行

  3. 查找字符
    /关键字: 先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按n往后寻找
    ?关键字:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按n往前寻找

  4. 保存与退出
    w: 可以将文件保存起来,使用强制保存
    q:退出vim,后加!强制离开vim
    wq:保存并退出

gcc与g++

在之前的C语言部分,我们知道我们所写的C代码要经过一系列处理为可执行程序后才能被系统执行,其中包括预编译、编译、汇编、链接

在Windows环境下我们经常使用Visual Studio、DevC、VC等开发环境环境进行代码的编写、编译与运行。而在Linux下我们使用vim编写代码后,就使用gccg++编译C与C++代码

gcc的使用(g++类似)

首先创建一个test_gcc.c文件,并使用vim在其中编辑一段代码:
在这里插入图片描述

预编译

在预编译中会进行头文件包含、宏替换、注释删除、条件编译等,在Linux中执行完预编译后会生成一个.i文件

使用 gcc -E 依赖文件 -o 目标.i文件 就可以实现将原文件只处理到预编译结束,生成.i文件为止
在这里插入图片描述

我们可以使用vim打开这个test_gcc.i文件查看预编译后的代码:
在这里插入图片描述
可以看到,与之前的代码对比,将stdio.h文件拷贝到这里,并删除了注释,将M替换为100。

编译

编译即将预编译后的文件转化为汇编代码,在这之前还需要做词法分析、语法分析、语义分析、代码优化等的行为,在这过程中将会检查代码中的错误(即编译错误)。编译结束后会生成一个.s文件

使用gcc -S 原文件 -o 目标.s文件 就可以实现将原文件只处理到编译结束,生成.s文件中止,(原文件可以为.c文件,也可以是已经预编译后的.i文件)
在这里插入图片描述
当然我们也可以使用vim查看这个.s文件:
在这里插入图片描述

汇编

汇编即将之前生成的汇编代码生成目标代码(在这里就是机器可识别的二进制代码),这其中还要进行符号表的生成等(符号与其地址),之后会生成一个.o文件

使用 gcc -c 原文件 -o 目标.o文件 就可以将原文件处理到汇编结束,生成.o文件为止(原文件可以为之前的任意状态的文件)
在这里插入图片描述
我们当然也可以通过vim查看这个.o文件(但这并没有什么意义,因为完全看不懂,这里就不展示了)

链接

在进行完之前的处理后,就需要将我们写的文件与库,或者与我们写的其他文件链接起来,最终生成一个可执行程序。这个过程中会重新定位符表
在这里插入图片描述
使用 gcc 原文件 -o 可执行文件 就可以实现将之前任一状态的文件处理后进行链接从而生成一个可执行程序
在这里插入图片描述
./打开这个可执行程序就可以运行了:
在这里插入图片描述

需要注意的是,当编辑的代码中含有C99标准及以后的语法时,需要在编译时加上 -std=c99 选项

静态库与动态库

我们在文件中包含的stdio.h只是头文件,即声明。而这些函数的定义是在库中的,这也就是为什么我们需要将我们写的代码与库进行链接后才能生成可执行程序。 系统中有两种类型的库,即静态库与动态库

静态库是指编译链接时,把库文件的代码全部加入到可执行文件中。所以生成的文件比较大,但在运行时也就不再需要库文件了,其后缀名一般为.a
动态库是在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为.so

gcc 在编译时默认使用动态库(可以通过file查看):
在这里插入图片描述
在这里插入图片描述

总结

到此,关于Linux工具中的编译器vim与编译器gcc/g++就介绍完了
在下一篇文章中将介绍其余的Linux工具,希望大家持续关注哦

如果大家认为我对某一部分没有介绍清楚或者某一部分出了问题,欢迎大家在评论区提出

如果本文对你有帮助,希望一键三连哦

希望与大家共同进步哦

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

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

相关文章

opencv python 训练自己的分类器

源码下载 一、分类器制作 1.样本准备 收集好你所需的正样本,和负样本,分别保存在不同文件夹 在pycharm新建项目,项目结构如下:has_mask文件夹放置正样本,no_mask文件夹放置负样本 安装opencv,把opencv包…

Day.4 刷题练习(自守数)

题目: 例子: 分析题目: 主要目的:给定一个范围小于等于N,在这个范围中找自守数(自身等于平方后的尾部数据如5:5 ^ 2 25 , 然后 5 与 平方的后的尾部相等) 思路&#x…

ancos注册中心、网关和静态化freemarker、对象存储服务MinIO

1、docker安装ancos ①:docker拉取镜像 docker pull nacos/nacos-server:1.2.0②:创建容器 docker run --env MODEstandalone --name nacos --restartalways -d -p 8848:8848 nacos/nacos-server:1.2.0③:访问地址:http://192…

Qt : day4

1.思维导图 2.服务器 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//给服务器指针实例化空间server new QTcpServer(this);}Widget::~Widget() {delete ui;…

下级平台级联视频汇聚融合平台EasyCVR,层级显示不正确的原因排查

视频汇聚平台安防监控EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等,以及厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等,能对外分发RTSP、RTMP、FLV、HLS、WebRTC等…

【计算机网络】第 3 课 - 计算机网络体系结构

欢迎来到博主 Apeiron 的博客,祝您旅程愉快 ! 时止则止,时行则行。动静不失其时,其道光明。 目录 1、常见的计算机网络体系结构 2、计算机网络体系结构分层的必要性 2.1、物理层 2.2、数据链路层 2.3、网路层 2.4、运输层 2…

Sentinel nacos spring cloud 持久化配置---分布式/微服务流量控制

文章目录 sentinel控制台安装目标实现代码地址版本说明maven spring-cloud-starter-alibaba-sentinel依赖yml文件Nacos业务规则配置看源码配置规则SentinelProperties 总配置加载DataSourcePropertiesConfiguration 配置标准的nacos配置注册具体sentinel配置 外传 sentinel控制…

Chrome 115 有哪些值得关注的新特性?

今天带大家一起来了解一下 Chrome 115 值得关注的新特性。 滚动动画 用滚动驱动的动画是网站上非常常见的用户体验模式,比如当页面向前或向后滚动时,对应的动画也会向前或向后移动。 比如下面图中这种比较常见的,页面顶部的进度条随着滚动…

华为OD机试真题 Java 实现【数字涂色】【2022Q4 100分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷)》。 刷的越多&…

Flowable-UI

title: Flowable-UI date: 2023-7-23 12:19:20 tags: - Flowable Flowable-UI 安装 手把手教大家画了这样一个流程图,虽然说它不是特别好用,但是也不是不能用,也能用。好了,那么接下来的话,我们这个就先告一个段落&…

客户方数据库服务器CPU负载高优化案例

客户方数据库服务器CPU负载高优化案例 背景 上周线上服务出现一个问题,打开某个页面,会导致其它接口请求响应超时,排查后发现数据库响应超400s,之前1s就可查到数据。 具体原因是有个大屏统计页面,会实时查看各业务服…

Netty学习(三)

文章目录 三. Netty 进阶1. 粘包与半包1.1 粘包现象服务端代码客户端代码 1.2 半包现象服务端代码客户端代码 1.3 现象分析粘包半包缘由滑动窗口MSS 限制Nagle 算法 1.4 解决方案方法1,短链接方法2,固定长度方法3,固定分隔符方法4&#xff0c…

QT之QMediaPlayer使用播放音频

简介 使用QMediaPlayer播放MP3格式音乐。 播放相关状态流程简述 操作:m_pMediaPlayer->setMedia(); (初始化加载,为play()) 状态: __onMediaChanged QUrl(“qrc:/sounds/Sounds/Big.mp3”) __onMediaStatusChang…

【javaSE】初识Java

目录 Java是什么 Java语言发展简史 初识Java的main方法 运行Java程序 JDK、JRE、JVM之间的关系 Java中的标识符 Java是什么 Java是一种优秀的程序设计语言,它具有令人赏心悦目的语法和易于理解的语义. 不仅如此,Java还是一个有一系列计算机软件和规…

Psim 2022仿真软件的安装--Psim电力仿真实战教程

文章目录 Psim 2022 仿真软件安装及使用教程软件介绍1.下载psim 2022安装软件,有需要的亲请联系作者。2.点击安装文件3.点击进行安装:4.安装完成,打开软件,开始仿真5.仿真模型介绍5.1.单相全控整流电路仿真5.2 三相PFC可控整流电路…

红黑树深入剖析【C++】

目录 一、红黑树概念 二、红黑树节点结构设计 三、插入操作 处理情况1 处理情况2 处理情况3 插入总结: 四、插入操作源码 五、红黑树验证 一、红黑树概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色&#xff0…

Selenium+Java环境搭建(测试系列6)

目录 前言: 1.浏览器 1.1下载Chrome浏览器 1.2查看Chrome浏览器版本 1.3下载Chrome浏览器的驱动 2.配置系统环境变量path 3.验证是否成功 4.出现的问题 结束语: 前言: 这节中小编给大家讲解一下有关于Selenium Java环境的搭建&…

Docker 的数据管理 与 Dockerfile

目录 Docker 的数据管理容器互联(使用centos镜像)Docker 镜像的创建1.基于现有镜像创建2.基于本地模板创建3.基于Dockerfile 创建镜像加载原理 Dockerfile 操作常用的指令(1)FROM 镜像&#xff…

docker—springboot服务通信

文章目录 docker—springboot服务通信一、方式1、host 二、坑点末、参考资料 docker—springboot服务通信 一、方式 1、host 步骤: host文件增加域名解析: 127.0.0.1 rabbitmqapplication.yml: application.yml中,连接方式使用…

[STL]list使用介绍

[STL]list使用 注:本文测试环境是visual studio2019。 文章目录 [STL]list使用1. list介绍2. 构造函数3. 迭代器相关函数begin函数和end函数rbegin函数和rend函数 4. 容量相关函数empty函数size函数 5. 数据修改函数push_back函数和pop_back函数push_front函数和pop…