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工具,希望大家持续关注哦

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

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

希望与大家共同进步哦

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

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

相关文章

03-树1 树的同构(c++)

03-树1 树的同构 给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。 现…

MySQL优化(面试)

文章目录 通信优化查询缓存语法解析及查询优化器查询优化器的策略 性能优化建议数据类型优化索引优化 优化关联查询优化limit分页对于varchar end mysql查询过程: 客户端向MySQL服务器发送一条查询请求服务器首先检查查询缓存,如果命中缓存,则立刻返回存…

基于Javaweb实现ATM机系统开发实战(十五)退卡和转账跳转实现

首先创建一个servlet接受和处理请求: package com.atm.servlet;import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException;//用户退出 WebServlet("/logout") public class ExitServlet ex…

CSDN浏览如何解决

一、对于平时我们苦恼csdn数据不够好看 当面试等各个场合需要我们装*或者秀技术无法拿出亮眼的时候,刚好我闲时间编译的在线模块适合你 二、如何操作(虚拟平台我已给大家放到最后直接使用即可) 重点:pc端必须拥有python环境 win…

JGIT获取远程仓库、本地仓库提交版本号

https://www.freesion.com/article/50181381474/ JGIT获取远程仓库、本地仓库提交版本号 一、环境搭建二、项目结构二、代码部分 GitUtils.javaGitInfoAtom.java三、运行结果&#xff1a;总结 一、环境搭建 Maven依赖导入 <dependency><groupId>org.eclipse.jg…

图像滤波器

图像噪声 • 图像噪声是图像在获取或是传输过程中受到随机信号干扰&#xff0c;妨碍人们对图像理解及分析处理 的信号。 • 图像噪声的产生来自图像获取中的环境条件和传感元器件自身的质量&#xff0c;图像在传输过程中产 生图像噪声的主要因素是所用的传输信道受到了噪声…

【深度学习】基于图形的机器学习:概述

一、说明 图神经网络&#xff08;GNN&#xff09;在数据科学和机器学习中越来越受到关注&#xff0c;但在专家圈之外仍然知之甚少。为了掌握这种令人兴奋的方法&#xff0c;我们必须从更广泛的图形机器学习&#xff08;GML&#xff09;领域开始。许多在线资源谈论GNN和GML&…

DP83867IS SGMII eye diagram问题调试记录

1. 前言 使用的是带CPU的DP83867IS,通过SGMII接口 从PHY到CPU的眼图看起来很好 而从CPU到PHY的眼图很差 2. 问题梳理 (1)能证实SGMII道有100欧姆的阻抗吗? (2)能不能做一个误码率测试来看看眼图是否仍然是可以接受的? (3)因为从PHY到CPU的眼睛是好的,可能有一个…

Oracle 最高安全架构

​在当今世界中&#xff0c;数据库是存储敏感信息的宝贵资料库&#xff0c;攻击者总是在寻找目标。这导致网络安全威胁的增加&#xff0c;因此有必要采取适当的保护措施。Oracle Maximum Security Architecture&#xff08;MSA&#xff09;就是一种提供数据库端到端安全的解决方…

MYSQL 主从复制

在读多写少的网络环境下&#xff0c;MySQL 如何优化数据查询方案 假如说一个电商平台 到双十一了 大量的读写操作 如果不做点什么的话 平台就被冲烂了 那我们要怎么办呢? 你或许会想 林北直接一个redis缓存 帮数据库度过难关 这个操作实际上是不行的 因为应用缓存的原则之一…

【开发环境】Windows下搭建TVM编译器

关于搭建TVM编译器的官方文档&#xff1a;Install from Source — tvm 0.14.dev0 documentation (apache.org) 1. 安装Anaconda 首先我们需要安装Anaconda&#xff0c;因为其中包含着我们所需要的各类依赖&#xff1a; 进入Anaconda官网https://www.anaconda.com/products/d…

【Spring Cloud Alibaba】Sentinel运行原理

文章目录 前言1、基本原理2、SphU.entry()2.1、StringResourceWrapper2.2、Entry 3、entry.exit()4、Context 前言 本文基于sentinel-1.8.0版本 Sentinel 是面向分布式服务架构的流量控制组件&#xff0c;主要以流量为切入点&#xff0c;从限流、流量整形、熔断降级、系统负载保…

DoIP学习笔记系列:导航篇

文章目录 1. 前言2. 导航3. 参考资料 1. 前言 DoIP学习笔记系列是一整套基于网络的诊断协议学习笔记&#xff0c;非常适合对有UDS基础但对DoIP没有实战经验的小伙伴参考&#xff0c;通过源协议讲解&#xff0c;企标讲解&#xff0c;测试需求讲解&#xff0c;测试用例讲解&…

STM32CubeMX配置STM32G031多通道ADC采集(HAL库开发)

时钟配置HSI主频配置64M 勾选打开8个通道的ADC 使能连续转换模式 配置好串口&#xff0c;选择异步模式配置好需要的开发环境并获取代码 修改main.c 串口重定向 #include "stdio.h" int fputc(int ch, FILE *f) {HAL_UART_Transmit(&huart1, (uint8_t *)&ch…

Shell脚本学习-read命令

Shell变量可以直接赋值或者脚本传参的方式&#xff0c;还可以使用echo命令从标准输入中获得&#xff0c;read为bash内置命令。 [rootvm1 ~]# type echo echo is a shell builtin常用参数&#xff1a; -p prompt&#xff1a;设置提示信息&#xff0c;我们看help内容的信息&…

开发中遇到的 cookie 问题

1. cookie 无法跨域携带问题 尽管已经登录&#xff0c;但是请求接口返回状态码&#xff1a;202&#xff0c;msg&#xff1a; 未登录&#xff0c;如下图所示&#xff1b; 1.1 XMLHttpRequest.withCredentials未设置 如果需要跨域 AJAX 请求发送 Cookie&#xff0c;需要withCre…

【C++】STL---list基本用法介绍

个人主页&#xff1a;平行线也会相交&#x1f4aa; 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C之路】&#x1f48c; 本专栏旨在记录C的学习路线&#xff0c;望对大家有所帮助&#x1f647;‍ 希望我们一起努力、成长&…

基于YOLOv8开发构建蝴蝶目标检测识别系统

在前面的一篇博文中已经很详细地描述了如何基于YOLOv8开发构建自己的个性化目标检测模型&#xff0c;感兴趣的话可以看下&#xff1a; 《基于YOLOv8开发构建目标检测模型超详细教程【以焊缝质量检测数据场景为例】》 本文的主要目的就是基于YOLOv8来开发构建细粒度的蝴蝶目标…

Python深度学习“四大名著”之一【赠书活动|第二期《Python机器学习:基于PyTorch和Scikit-Learn》】

近年来&#xff0c;机器学习方法凭借其理解海量数据和自主决策的能力&#xff0c;已在医疗保健、 机器人、生物学、物理学、大众消费和互联网服务等行业得到了广泛的应用。自从AlexNet模型在2012年ImageNet大赛被提出以来&#xff0c;机器学习和深度学习迅猛发展&#xff0c;取…

Centos报错:[Errno 12] Cannot allocate memory

执行一个脚本刚开始正常&#xff0c;后面就报[Errno 12] Cannot allocate memory 如果内存不足&#xff0c;可能需要增加交换内存。或者可能根本没有启用交换。可以通过以下方式检查您的交换: sudo swapon -s如果它为空&#xff0c;则表示您没有启用任何交换。添加 1GB 交换…