(学习总结25)Linux工具:vim 编辑器 和 gcc/g++ 编译器

Linux工具:vim 编辑器 和 gcc/g++ 编译器

  • vim 编辑器
    • 在 Linux 命令行中执行 vim
    • vim 命令模式
      • 光标操作相关命令
      • 文本或字符操作命令
      • 撤销操作命令
      • 查找操作
    • vim 插入模式
    • vim 底行模式
      • 查找与编写操作
      • 界面操作
      • 文件处理操作
      • vim 与 shell 交互
      • 其它操作
      • 退出 vim 一般操作
    • vim 可视模式
    • vim 替换模式
    • vim 简单配置
      • 配置文件位置:
      • 常用配置选项,用来测试(可以在 vim 底行模式使用):
      • 使用插件
  • gcc/g++ 编译器
    • 在 Linux 命令行中执行 gcc/g++
    • gcc/g++ 编译步骤
      • 1. 预编译
      • 2. 编译(编译成汇编)
      • 3. 汇编(生成二进制目标文件)
      • 4. 链接(生成可执行文件)
    • gcc 与 g++ 的区别

vim 编辑器

Linux 系统中的 vim 是一款具有多模式的文本编辑器,它有三种主要模式:命令模式、插入模式和底行模式,还有一些特定模式如:替换模式、可视模式(V-BLOCK)。

在这里插入图片描述

在 Linux 命令行中执行 vim

语法:vim [选项] [文件名]
功能:选择 vim 的打开方式
常用选项:

  • -R:以只读模式打开文件
  • -r:恢复崩溃前的文件(用于恢复未保存的修改)
  • +[行号]:打开文件并跳转到指定行的行号
  • +[“命令”]:启动 vim 时 vim 可直接执行双引号中的 命令
  • -c ‘命令’ :启动后执行 vim 命令,同上
  • vim -d [文件名1] [文件名2]:对比两个文件(进入 diff 模式)
  • --noplugin :禁用插件加载
  • -u NONE :不加载任何配置文件(安全模式)
  • vim -c "oldfiles:显示最近打开的文件列表
  • -x:创建或编辑加密文件(首次需设置密码)
  • -X:禁用与 X Server 的连接(加速启动)
  • -b:以二进制模式打开文件

其它操作:

  • vim [文件名1] [文件名2] [文件名3] ... 同时打开多个文件
  • 不写文件名默认打开一个新文件

vim 命令模式

进入 vim 时的模式默认是命令模式,在命令模式下可以快速编辑如光标移动、内容操作等命令,并且输入大多数命令之前都可以加上数字进行批量或更精确的操作

光标操作相关命令

  • gg:快速回归光标
  • G:快速定位光标到结尾
  • w 或 shift+w:光标移动到前一个单词
  • b 或 shift+b:光标移动到下一个单词
  • h / j / k / l:光标向 左 / 下 / 上 / 右 移动
  • $:光标移动到当前行末尾
  • ^ 或 0:光标移动到当前行开始

文本或字符操作命令

  • yy:复制当前行
  • yw:复制一个单词
  • p / P:粘贴到光标 后 / 前
  • dd:剪切或删除当前行
  • d$ 或 D:删除从当前光标到行尾
  • dw:删除一个单词
  • x / X:右 / 左 移删除当前行的字符
  • r:替换光标位置的字符
  • shift + ~:字符大小写切换
  • Ctrl + f / Ctrl + b:向下/上翻页
  • Ctrl + u / Ctrl + d:向下/上翻半页

撤销操作命令

  • u:撤销历史操作
  • Ctrl + r:撤销 u 命令操作

查找操作

  • #:选中单词命令(n 上找,N 下找)

vim 插入模式

vim 插入模式用于编写文件,在命令模式下按住下面其中一个功能键可以进入该模式:

  • i:光标前插入
  • a:光标后插入
  • o:下方新行插入
  • I:行首插入
  • A:行尾插入
  • O:上方新行插入

返回命令模式只需按一下 Esc 键即可。

vim 底行模式

vim 底行模式可用于与 shell 交互、整体界面操作等等,在命令模式下使用 shift+;: 可进入,使用 Esc 返回命令模式。

查找与编写操作

  • /[关键字](可在命令模式下使用):向下搜索(n 下找,N 上找)

  • ?[关键词](可在命令模式下使用):向上搜索(n 上找,N 下找)

  • :s/旧内容/新内容:替换当前行第一个匹配

  • :s/旧内容/新内容/g:替换当前行所有匹配

  • :%s/旧内容/新内容/g:全局替换(末尾加 c 进入细分替换)

界面操作

  • :vs [文件名] :添加可操作的文件,使其多文件操作

  • Ctrl + w + w:循环切换窗口

  • :e [文件名] :打开新文件(不关闭当前文件)

  • :split:sp:水平分割分屏

  • :vsplit:vsp:垂直分割分屏

  • Ctrl + w + h/j/k/l:向左/下/上/右切换窗口

文件处理操作

  • :w :保存文件
  • :q :退出文件
  • ! :带上 ! 的操作有强制的意思
  • :%!xxd:将文件以十六进制和 ASCII 字符混合的形式显示
  • :%!xxd -r:在 :%!xxd 格式后恢复原始格式

vim 与 shell 交互

在 vim 中直接执行 shell 命令:

  • :![命令] :执行 shell 命令(如 :!ls -l
  • :r ![命令] :将命令输出插入到当前光标位置(如 :r !date
  • :w !sudo tee % :用 sudo 权限保存当前文件(无写权限时常用)

其它操作

  • :ls :列出所有已打开的文件缓冲区
  • :b [编号]:b [文件名] :切换到指定缓冲区(通过 :ls 查看编号)
  • :bn :切换到下一个缓冲区
  • :bp :切换到上一个缓冲区

退出 vim 一般操作

  • :wq:x:保存并退出
  • :q!:不保存强制退出
  • :wa + :qa:保存所有文件并退出

vim 可视模式

可视模式允许玩家批量选择操作文件,在命令模式下使用不同命令进入不同类型的可视模式:

  • Ctrl + v:进入块可视模式

  • v:进入字符可视模式

  • V:进入行可视模式

在可视模式中,选中对应区域后可用 y(复制)d(删除)p(粘贴) 等操作,Esc 可以返回命令模式。

如果想要按照行批量插入字符,只允许在块可视模式下先选择区域,使用 shift+i 进入插入模式编写后,再 Esc 返回到命令模式才能生效

vim 替换模式

在命令模式中使用 shift + r 可以进入替换模式,批量化替换光标位置字符,Esc 返回。

vim 简单配置

配置文件位置:

  • 在目录 /etc/vim 下面,有个名为 vimrc 的文件,这是系统中公共的 vim 配置文件,对所有用户都有效。
  • 在每个用户的主目录下,都可以自己建立私有的配置文件,命名为:“.vimrc”。例如,/root 目录下,通常已经存在一个 .vimrc文件,如果不存在,则可以创建它。
  • 切换用户成为自己执行 su ,进入自己的主工作目录,执行 cd ~
  • 打开自己目录下的 .vimrc 文件,执行 vim/.vimrc

常用配置选项,用来测试(可以在 vim 底行模式使用):

  • 设置语法高亮:syntax on
  • 显示行号:set nu
  • 设置缩进的空格数为 4:set shiftwidth=4

使用插件

要配置好看的 vim,原生的配置可能功能不全,可以选择安装插件来完善配置,但要保证用户是自己需要配置的用户。

想了解 vim 更多的读者可以看看这些大佬的文章:

Vim配置和使用
Vim 从入门到精通
手把手教你把Vim改装成一个IDE编程环境(图文)
Linux系列讲解 —— VIM配置与美化

vim配置工具 vimplus 下载地址:vimplus

gcc/g++ 编译器

gcc 和 g++ 都是 GNU 编译器集合(GCC)中的重要工具,可以编译 C(gcc) 和 C++(g++) 代码,但两者之间存在一些明显的区别。

在 Linux 命令行中执行 gcc/g++

语法
gcc [选项] [源文件] ... -o [输出文件]
g++ [选项] [源文件] ... -o [输出文件]
功能:gcc 将 .c 文件编译成可执行文件,g++ 将 .cpp 文件编译成可执行文件。
常用选项

  • -c :只编译不链接,生成目标文件(.o)
  • -g :生成调试信息,用于 gdb 调试
  • -Wall :启用所有警告信息
  • -O1/-O2/-O3 :优化级别(1 为基本优化,3 为最高优化)
  • -I [目录] :指定目录搜索头文件
  • -L [目录] :指定目录搜索库文件
  • -I(等价 shift+i) [库名] :链接指定的库(如 -lm 链接数学库)
  • -std=[标准] :指定语言标准(如 -std=c11 或 -std=c++17)

预处理选项:

  • -E :只进行预处理,输出到标准输出
  • -D[宏] :定义宏(如 -DDEBUG 定义 DEBUG 宏)
  • -U[宏] :取消定义宏
  • -I[目录] :添加头文件搜索路径
  • -M:生成依赖关系(用于 Makefile)
  • -MM :生成依赖关系,忽略系统头文件

编译选项:

  • -S :只编译到汇编代码,生成 .s 文件
  • -fPIC :生成位置无关代码(用于动态库)
  • -fno-stack-protector :禁用栈保护
  • -fstack-protector :启用栈保护
  • -fomit-frame-pointer :省略帧指针(优化性能)
  • -pipe :使用管道代替临时文件(加快编译速度)

优化选项:

  • -O0 :不优化(默认)
  • -O1 :基本优化
  • -O2 :更多优化(推荐)
  • -O3 :最高优化
  • -Os :优化代码大小
  • -Ofast :激进优化(可能不符合标准)
  • -flto :启用链接时优化

调试选项:

  • -g :生成调试信息
  • -ggdb :生成 GDB 专用调试信息
  • -g3 :生成更多调试信息(如宏定义)
  • -p :生成性能分析信息(用于 gprof)
  • -pg :生成性能分析信息(用于 gprof)

链接选项:

  • -static :静态链接
  • -shared :生成共享库(动态库)
  • -L[目录] :添加库文件搜索路径
  • -l[库名] :链接指定库(如 -lm 链接数学库)
  • -nostdlib :不链接标准库
  • -nodefaultlibs :不链接默认库
  • -pie :生成位置无关可执行文件

警告选项:

  • -w :不生成任何警告信息
  • -Wall :启用所有常见警告
  • -Wextra :启用额外警告
  • -Werror :将警告视为错误
  • -Wno-[警告] :禁用特定警告
  • -pedantic :严格遵循标准
  • -pedantic-errors :严格遵循标准并将警告视为错误

语言标准选项:

  • -std=c89 :使用 C89 标准
  • -std=c99 :使用 C99 标准
  • -std=c11 :使用 C11 标准
  • -std=c++98 :使用 C++98 标准
  • -std=c++11 :使用 C++11 标准
  • -std=c++14 :使用 C++14 标准
  • -std=c++17 :使用 C++17 标准
  • -std=c++20 :使用 C++20 标准

其它选项:

  • -v :显示编译过程详细信息
  • -### :显示但不执行编译命令
  • -save-temps :保存临时文件(如 .i、.s、.o)
  • -march=[架构] :指定目标架构(如 -march=native)
  • -mtune=[架构] :优化目标架构(如 -mtune=native)

gcc/g++ 编译步骤

1. 预编译

在使用 gcc/g++ 编译代码时,选项部分加上 -E 即可生成预编译后的代码,此时文件后缀一般规定(在 Linux 下)为 .i

在预编译期间,gcc/g++ 会处理基础性任务,如:条件编译、宏替换、移除注释等等,生成一个干净的代码文本。

条件编译的用途:

  1. 软件可以区分专业度,如收费情况的区分,使用条件编译可以对一份代码进行功能上的裁剪,方便维护。
  2. 系统内核源代码在条件编译下可以模块化处理,方便特定条件下的需求,如有些单片机使用 Linux 系统并不需要它的网络模块。
  3. 开发工具与应用软件可以在不同系统下运行使用,如一个软件包既可以在 Linux 下安装使用,也可以在 windows 下安装使用。

2. 编译(编译成汇编)

在使用 gcc/g++ 编译代码时,选项部分加上 -S 即可生成汇编代码,此时文件后缀一般规定(在 Linux 下)为 .s

为什么 gcc/g++ 要先编译成汇编代码? 因为需要减少编译成本,如果直接编译成二进制执行的命令,需要自己处理表达的二进制可能出现的 bug, 而编译成汇编代码(汇编代码比二进制代码更易读)可以更容易的排错并使用已经成熟的方法来减少成本。

3. 汇编(生成二进制目标文件)

在使用 gcc/g++ 编译代码时,选项部分加上 -c 即可生成二进制代码,此时文件后缀一般规定(在 Linux 下)为 .o

此时生成的文件内容已经可以被系统识别(目标文件)。但是一般情况下,文件中的有些执行方法是不全的,文件只给了方法的链接地址,编译器还需要通过链接将执行方法找到并将链接地址替换为具体的找到方法执行的地址,此时文件才可以称得上是可执行文件。

目标文件是制作动态库与静态库的前提。

4. 链接(生成可执行文件)

在使用 gcc/g++ 编译代码时,选项部分不填默认是将文件直接执行编译 1->2->3->4 这4个步骤生成可执行文件。

链接步骤会将文件链接对应的库文件,最后形成可执行文件。

库文件是一套方法或数据集,为其他程序员开发提供最基本的接口与功能,帮助其二次开发。

库文件分类:

  1. 动态库:Linux( .so ),windows( .dll )
  2. 静态库:Linux( .a ),windows( .lib )

链接实行方法:文件链接库文件时,链接地址替换为能找到库中方法的地址。

对于静态库,文件中需要的方法会直接拷贝静态库中的方法,执行时只需调用自己拷贝的那份。

对于动态库,文件中需要的方法只会拷贝找到动态库方法的地址,执行时会寻找动态库的方法。

动静态库对比:

  1. 链接动态库形成的可执行程序体积一定比静态库小。
  2. 可执行程序对静态库的依赖度小,但可执行文件不能缺失动态库
  3. 程序运行需要加载到内存,一个静态库重复链接其它可执行程序,会导致内存中出现大量的重复代码。
  4. 动态链接,比静态链接节省内存和磁盘资源

动态库本质作用是将语言层面公共的代码,在内存中确保只出现一份,从而节省资源。

gcc 与 g++ 的区别

  1. 从编译行为上说,gcc 编译 C语言代码, g++ 编译 C++代码,但是 g++ 也可以编译 C语言的代码,gcc 想要编译 C++代码需要显示链接 C++标准库(-lstdc++)。

  2. 从文件扩展名上说,gcc 只会处理后缀 .c 文件,g++ 可以处理 .cpp 也可以处理 .c 文件。

注意:使用 gcc 编译 C++代码,一般不会通过 C++ 具有的特性如:类、模版等用法。

对于两者命令行中的选项,除开标准库选项的使用,大部分选项两者都可以共用。

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

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

相关文章

IntelliJ IDEA中Maven配置全指南

一、环境准备与基础配置 1.1 Windows 环境下载并配置 Maven 见此篇博文:环境配置 1.2 IDEA配置步骤 打开设置面板:File → Settings → Build → Build Tools → Maven 关键配置项: Maven home path E:\apache-maven-3.9.9 (…

第4章 信息系统架构(三)

4.3 应用架构 应用架构的主要内容是规划出目标应用分层分域架构,根据业务架构规划目标应用域、应用组和目标应用组件,形成目标应用架构逻辑视图和系统视图。从功能视角出发,阐述应用组件各自及应用架构整体上,如何实现组织的高阶…

Ubuntu 20.04源码安装opencv 4.5.0

安装依赖项 sudo apt install -y g sudo apt install -y cmake sudo apt install -y make sudo apt install -y wget unzip安装opencv依赖库 sudo apt-get install build-essential libgtk2.0-dev libgtk-3-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev l…

前端如何转战鸿蒙

前端如何转战鸿蒙系统 在当今技术日新月异的时代,前端开发者们不断探索新的领域和机会。随着鸿蒙系统的崛起,一个全新的生态正等待着前端开发者们去开拓。那么,作为前端开发者,我们为何要转战鸿蒙系统?又该如何顺利转型…

Linux(ubuntu) GPU CUDA 构建Docker镜像

一、创建Dockerfile FROM ubuntu:20.04#非交互式,以快速运行自动化任务或脚本,无需图形界面 ENV DEBIAN_FRONTENDnoninteractive# 安装基础工具 RUN apt-get update && apt-get install -y \curl \wget \git \build-essential \software-proper…

新能源汽车核心元件揭秘:二极管、三极管结构与工作原理解析(2/2)

上一节我们讲了二极管的原理, 原文章: https://zhuanlan.zhihu.com/p/25252117833 看了的朋友应该很容易懂这节课 这篇文章我们来说说三极管的工作原理啊 这里要说下几个概念 1 半导体的导通, 就是说里面的负电荷电子和正电荷空穴可以大量的从 一个地方达到我们想要的地方…

2024年数学SCI1区TOP:改进海洋捕食者算法MMPA用于UAV路径规划,深度解析+性能实测

目录 1.摘要2.海洋捕食者算法MPA原理3.改进策略4.结果展示5.参考文献6.获取代码 1.摘要 本文提出了一种改进海洋捕食者算法(MMPA),用于解决具有多重威胁的复杂环境中的全局优化问题,针对无人机(UAV)路径规…

QML ToolButton与DelayButton的使用、详解与自定义样式

QML MenuBarItem与MenuItem的使用、详解与自定义样式 一、介绍1、ToolButton常见用法基础示例设置图标 常用属性texticonenabledshortcutcheckable & checked 信号onClickedonPressed 和 onReleased 样式和外观使用场景 2、DelayButton使用场景核心属性1. delay 核心信号1.…

Linux下基本指令(4)

Linux权限的概念 Linux下有两种用户:超级用户(root)、普通用户。 超级用户:可以再linux系统下做任何事情,不受限制 普通用户:在linux下做有限的事情。 超级用户的命令提示符是“#”,普通用户…

网络安全设备防护原理 网络安全防护装置

🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 防火墙 简介 网络层的防护设备,依照特殊的规则允许或者限制传输的数据通过 是由软件和硬件设备组合而成,在内部网和外部网之间、专用网…

windwos与linux环境下Iperf3带宽测试工具的安装、使用

目录 一、前言 二、windows 2.1下载 2.2安装 2.3使用 2.3.1服务端 2.3.2客户端 2.3.3输出内容 1.客户端 2.服务端 2.4.相关命令 三、linux 3.1安装 3.2使用 1.服务端 2.客户端 3.输出内容 1.客户端 2.服务端 一、前言 在数字化浪潮下,网络性能…

达梦统计信息

统计信息 统计信息概述 统计信息是数据库中关于表和索引数据的元信息,用于描述数据的分布、唯一性、大小等特征。数据库优化器依赖统计信息来选择最优的执行计划。统计信息对于 CBO(基于代价的优化器)生成执行计划具有直接影响。 收集统计…

【面试系列】Java开发--AI常见面试题

1、实际工作或学习中用过哪些Ai工具 1.1、AI编程1.2、AI对话聊天1.3、AI图像工具1.4、AI办公工具 2、谈谈你知道的AI领域的一些常见词汇及其含义的理解? 例如AIGC、LLM、DeepLearning分别是什么意思? 2.1、AIGC(Artificial Intelligence Gene…

一文讲解Redis为什么读写性能高以及I/O复用相关知识点

Redis为什么读写性能高呢? Redis 的速度⾮常快,单机的 Redis 就可以⽀撑每秒十几万的并发,性能是 MySQL 的⼏⼗倍。原因主要有⼏点: ①、基于内存的数据存储,Redis 将数据存储在内存当中,使得数据的读写操…

OnlyOffice:前端编辑器与后端API实现高效办公

OnlyOffice:前端编辑器与后端API实现高效办公 一、OnlyOffice概述二、前端编辑器:高效、灵活且易用1. 完善的编辑功能2. 实时协作支持3. 自动保存与版本管理4. 高度自定义的界面 三、后端API:管理文档、用户与权限1. 轻松集成与定制2. 实时协…

【opencv】图像基本操作

一.计算机眼中的图像 1.1 图像读取 cv2.IMREAD_COLOR:彩色图像 cv2.IMREAD_GRAYSCCALE:灰色图像 ①导包 import cv2 # opencv读取的格式是BGR import matplotlib.pyplot as plt import numpy as np %matplotlib inline ②读取图像 img cv2.imread(…

fastadmin实现海报批量生成、邮件批量发送

记录一个海报批量生成、邮件批量发送功能开发,业务场景如下: 国外客户做观展预登记,工作人员通过后台,批量给这些观众生成入场证件并发送到观众登记的邮箱,以方便观众入场时快速进场。证件信息包含入场二维码、姓名&a…

3.Docker常用命令

1.Docker启动类命令 1.启动Docker systemctl start docker 2.停止Docker systemctl stop docker 3.重启Docker systemctl restart docker 4.查看Docker状态 systemctl status docker 5.设置开机自启(执行此命令后每次Linux重启后将自启动Docker) systemctl enable do…

1.21作业

1 unserialize3 当序列化字符串中属性个数大于实际属性个数时,不会执行反序列化 外部如果是unserialize()会调用wakeup()方法,输出“bad request”——构造url绕过wakeup 类型:public class&…

【Spring详解四】自定义标签的解析

四、自定义标签的解析 自定义标签的解析是通过 BeanDefinitionParserDelegate .parseCustomElement(ele)进行的,解析来我们进行详细分析。 DefaultBeanDefinitionDocumentReader.class 4.1 自定义标签的使用 扩展 Spring 自定义标签配置一般需要以下几个步骤&#x…