【Linux】编辑器vim 与 编译器gcc/g++
目录
一、编辑器vim:
1、对vim初步理解:
2、vim的模式:
3、进入与退出:
4、vim命令模式下的指令集:
移动光标:
删除:
cv:
撤销:
其他:
5、vim底行模式:
保存并退出
分屏操作:
二、编译器 gcc/g++
1、作用:
2、用法:
预处理:
编译:
汇编:
链接:
3、函数库:
动态库:
静态库:
比较:
一、编辑器vim:
1、对vim初步理解:
vim是一个文本编辑器,在我们做开发的时候,主要解决我们编写代码的问题,本质上就是一个多
模式的文本编辑器
对于一门语言可以用任何一个文字编辑软件编辑,代码编辑软件多了很多功能,本质上代码都是一
个不同格式的纯文本
编辑器上只能做记录,最好的举例就是跟Windows下记事本一样,还要经过其他的处理才能称为可执行程序。
2、vim的模式:
在初步学习的过程中,首先了解3中模式即可:
a、命令模式:
首先进入vim的默认模式就是命令模式,用户所有的输入都会被当做命令
在这个模式下可以进行许多指令的操作,这个模式是一输入指令为主的,指令在下面介绍,
b、插入模式:
这就是编写代码的模式
c、底行模式:
底行模式比较特殊, vim左下方如果有:就说明现在处于底行模式,底行模式中也有很多指令,但一般常用的就是w(保存代码)q(退出vim文本编辑)

如下就是三种模式之间的转化,插入模式到底行模式之间是不能够相互转换的。
插入模式和命令模式之间的转化:
1、通过 Ins 键切换
2、通过 i 切换,切换后光标停留在原位
3、通过 a 切换,切换后光标会回退一格
4、通过 o 切换,切换后会新起一行
5、通过 s 切换 ,切换后会将光标的位置删除

3、进入与退出:

首先,在使用vim的时候要先创建一个文件,
语法:vim 文件名
注意:
如果在vim后面跟上的是不存在的文件名,那么依然会进入vim编辑模式,这个时候会先自动创建新的这个不存在的文件名,在进入vim编辑模式

输入好再按下回车之后就会跳转到如下的页面,在默认通过vim进入文本的时候是命令模式

退出的时候就先进入底行模式,然后在输入wq按下回车键即可。
4、vim命令模式下的指令集:
移动光标:
h ----- 光标向左移动一位
j ----- 光标向下移动一行
k ----- 光标向上移动一行
l ----- 光标向右移动一位
shift + ^ (输入^)----- 光标移动到当前行的行首
shift + $ (输入$)----- 光标移动到当前行的行尾
gg ----- 光标移动到当前文本的最开始
shift + g (输入G) ----- 光标移动到当前文本的最末尾
n + shift + g (输入nG) ----- 这个n是一个数字,将光标移动到第n行的开头
直接按回车 Enter ----- 光标向下移动一行
n + Enter ------ 光标向下移动n行
w ----- 光标从左到右,从上到下 跳到下一个单词的开头
e ----- 光标从左到右,从上到下 跳到下一个单词的结尾
b ----- 光标从右到左,从下到上 跳到上一个单词的开头
删除:
x -------- 删除光标所在位置的字符
nx ------ 删除光标所在位置开始往后的n个字符
X ------- 删除光标所在位置的前一个字符
nX ----- 删除光标所在位置的前n个字符
dd ------ 删除光标所在行
ndd ----- 删除光标所在行开始往下的n行
cv:
yy ----- 复制光标所在行到缓冲区
nyy ----- 复制光标所在行开始往下的n行到缓冲区
yw ----- 光标所在位置到单词尾的所有字符复制到缓冲区
nyw ----- 光标所在位置开始往后的n个字复制到缓冲区(如果当前行的单词不够就向下找)
p ------- 将已复制的内容在光标的下一行粘贴上
np ----- 将已复制的内容在光标的下一行粘贴n次
撤销:
u ------ 对应着Windows的 Ctrl + Z 撤销
Ctrl + r ------ 返回上次撤销之前的代码
其他:
shift + ` (就是输入~) ------ 将光标所在的位置进行大小写的转换
n ~ ------ 将光标及所在位置向后的n个字符进行大小写转换
r + 一个字符 ------ 将光标所在的位置替换为输入的字符
n + r + 一个字符 ------ 将光标所在的位置及后面n个字符替换为输入的字符
5、vim底行模式:
保存并退出
w ----- 保存当前的代码
q ----- 退出vim模式
两个一起按就是保存并退出

注意:
如发现wq + Enter 退不回去,就可以在最后面加上!来达到强制退出
分屏操作:
首先在底行模式下可以输指令 ------ vs 文件名 来进行多个文件的打开
以下是输入了:vs test2.cpp

如果是不存在的文件,就会在原目录下新建一个文件,然后在打开

Ctrl + ww ------ 切换屏幕的光标指令,将光标在展开的窗口中进行切换
注意:
此时光标的位置在哪一个文件的位置,此时退出的时候就是退出的哪一个文件。
二、编译器 gcc/g++
1、作用:
编译器是将我们所写的代码转化成计算机能够“看得懂”的二进制代码的过程,gcc和g++的用法几乎是一模一样的,区别就是gcc是编译C语言的g++是编译C++的(也可以编译C语言),下面以g++为例:
g++在执行编译的时候有四步:
1.预处理(去注释,头文件展开,条件编译,宏替换)
2.编译(生成汇编)
3.汇编(生成机器可识别代码,就是二进制代码)
4.链接(将汇编过程产生的二进制代码进行链接,生成可执行文件或者库文件)
2、用法:
用法: g++ 选项 文件名
选项:
1、-o ----- 将处理结果输出到指定文件,该选项后需紧跟输出的文件名
2、-E ----- 这就是只进行预处理的阶段,告诉g++,从现在开始进行程序的翻译,将预处理工作做完就停下来,不要往后走了。
3、-S ----- 从现在开始进行程序的翻译将编译工作做完就停下来
4、 -c ----- 从现在开始进行程序的翻译,将汇编工作做完就停下来
5、-static ----- 此选项对生成的文件采用静态链接
6、-g ------ 生成调试信息 成为以dubug形式,默认是release模式
预处理:
四步: 去注释,头文件展开,条件编译,宏替换

去注释:发现预处理之后的代码的注释不在了
头文件展开:发现预处理之后的代码非常长,这就是将#include<iostream> 进行展开了
条件编译:只会留下条件编译通过的语句
宏替换:发现将DATA这个被替换为100
编译:

将编译之后的代码输出到test1.s中,可以看到经过编译之后,就会生成汇编代码

汇编:

将test1.s的汇编代码转换为计算机看得懂的二进制代码:
如下是用vim打开的,这是一个乱码,毕竟使用编辑器打开的二进制

但是也可以用指令看二进制(如下是截取的部分)
readelf -a test1.o

链接:
在成功编译之后,就进入了链接阶段,
若不用-o选项指定生成文件的文件名,则默认生成的可执行文件名为a.out
将程序运行所需的各种函数链接起来,包括与库函数的链接,Linux中一般是动态链接,链接后生成可执行文件,就可以执行了
注意:在链接后生成的可执行程序文件也是二进制的

3、函数库:
函数库分为静态库与动态库:
gcc 在编译时默认使用动态库。完成了链接之后,就可以生成可执行文件
动态库:
动态库,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为 .so
在Linux 中默认使用动态链接的方式,
可以用ldd指令来看程序所依赖的库,用法:ldd 可执行程序文件名
如上,基本可以看到动态库的标志是 libXXX.so
其中,去掉前缀lib,后缀.so,这样剩下的部分就是所调的动态库,
如上libc.so.6,去掉前缀与后缀,最后剩下的是c,就是调用C语言共享库
静态库:
静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为 .a

如上所示:
test.out 就是和动态库的链接 test_static.out 就是和静态库的链接
和动态库差不多,静态库的标志是 libXXX.a
其中,去掉前缀lib,后缀.a,这样剩下的部分就是所加入的静态库,因为静态链接就是将静态库拷贝到程序中的,因此最终的程序会比动态库要大
注意:
1、如果我们没有静态库,但是我们就要在编译的时候 -static,是不可以的
2、如果我们没有动态库,只有静态库,而且g++能够找到,那能不能在编译的时候 -static,
所以,-static的本质就是改变编译链接和函数库的优先级
3、一个程序不一定只有静态库或者是动态库,有的是混合的,二者都有
比较:
静态库(.a)
优点:
- 独立性:生成的可执行文件不依赖于外部的库文件,能够在没有该库的环境中运行。
- 运行效率:由于不需要在运行时加载库,程序的启动时间较短。
- 稳定性:适用于不需要频繁更新库的场景,对于嵌入式系统或需要快速启动的应用,静态库也是一个不错的选择。
缺点:
- 文件体积:可执行文件体积较大,因为它包含了所有的库代码。
- 更新复杂:如果库更新,所有依赖于该库的可执行文件都需要重新编译。
- 资源消耗:相同的库文件可能在内存中被加载多份,消耗系统资源,浪费内存。
动态库(.so)
优点:
- 文件体积小:可执行文件相对较小,因为不包含库的所有代码。
- 易于更新:只需替换动态库文件即可更新,而不需要重新编译依赖该库的所有程序。
- 资源共享:动态库可以被多个程序共享使用,减少内存消耗。
- 灵活性:可以控制何时加载动态库,不调用库函数动态库不会被加载。
缺点:
- 运行时依赖:如果缺少所需的动态库,程序无法运行。
- 加载时间:在启动时需要加载库,可能会稍微增加启动时间。
- 可移植性问题:程序的可移植性受到影响,如果想在不同的系统上使用动态库,可能需要用到专门的库兼容器。
总结来说,静态库提供了独立性和高性能,但代价是较大的文件体积和更新困难。动态库则更适合需要共享资源或频繁更新的项目,但依赖外部库文件。在实际开发中,了解这两者的特点,并根据项目的需求做出合适的选择,将有助于编写出更加高效和维护成本更低的代码。
相关文章:
【Linux】编辑器vim 与 编译器gcc/g++
目录 一、编辑器vim: 1、对vim初步理解: 2、vim的模式: 3、进入与退出: 4、vim命令模式下的指令集: 移动光标: 删除: cv: 撤销: 其他: 5、vim底行模…...
音频中sample rate是什么意思?
sample rate在数字信号处理中,指的是采样频率,即每秒钟从连续信号中抽取的样本数量。采样频率越高,信号的还原度越高,但同时也会增加计算负担和存储需求。 实际应用场景 在音频处理中,设置合适的采样率可以…...
Java思想
学习韩老师的java课程 一步一步拆解需求,先写死的再写活的 首先我只是写了个输出一个*的程序 然后写了输出靠墙的1到n,n排n个的*符号输出程序 再写了加入空格的实心金字塔程序,最后写了这个镂空的金字塔 一下就是成品 import java.util.Sc…...
演练纪实丨 同创永益圆满完成10月份灾备切换演练支持
2024年10月,同创永益共支持5家客户圆满完成灾备切换演练,共涉及70多套核心系统总切换与回切步骤6000余个,成功率100%,RTO时长均达到客户要求。 其中耗时最短的一次演练仅花费约3个小时,共涉及32套系统的灾备切换演练&a…...
UE Mutiplayer(1):网络概述
文章目录 一、Replication二、基本网络概念2.1 网络模式和服务器类型2.2 Actor复制2.3 网络角色和授权2.4 客户端拥有权2.5 相关性和优先级 三、变量复制四、远程过程调用(RPC) 一、Replication 在虚幻引擎中,在客户端与服务器间同步数据和调用程序的过程被称为复制…...
【SQL Server】中关于 COUNT 的一些使用方式区别
前言 使用 SQL Server时,对表或查询结果计算行数是一种常见的操作。了解一些使用 COUNT(*)、COUNT(1) 和 DISTINCT COUNT等的区别对于编写经过优化的高效查询至关重要。本文我们一起探讨这些使用COUNT方式,了解它们的差异与使用。 方式差异 1、COUNT(…...
第5关:主合取范式
任务描述 编程要求 输入 输出 输入样例 输出样例 任务描述 本关任务:求公式(p∨q)→r的主合取范式。 编程要求 根据提示,在右侧编辑器补充代码,计算并输出公式(p∨q)→r的主合取范式 输入 本题无输入。 输出 在单独的一行中输出公式的主合…...
vscode摸鱼学习插件开发
不知道大家在摸鱼的时候,会不会想要学习? 或者有没有考公人,下班要学习的? 上班时间摸鱼,下班时间不够学习? 为此,我决定开发一个vscode插件,来刷粉笔题 粉笔插件名称:…...
多线程编程与并发控制缓存策略负载均衡数据库优化
本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…...
Gradio DataFrame分页功能详解:从入门到实战
Gradio DataFrame分页功能详解:从入门到实战 1. 引言2. 为什么需要分页?3. 环境准备4. 基础知识准备5. 代码实现5.1 创建示例数据5.2 分页状态管理5.3 分页核心逻辑5.4 创建Gradio界面 6. 关键功能解析6.1 页码计算6.2 数据切片 7. 使用示例8. 实用技巧9…...
[OPEN SQL] FOR ALL ENTRIES IN
FOR ALL ENTRIES IN 语句用于从一个内部表中检索与另一个内部表中指定字段匹配的记录 语法格式 SELECT ... FOR ALL ENTRIES IN <itab> WHERE <cond>. <itab>:插入目标数据内表 <cond>:查询条件 使用FOR ALL ENTRY IN 语句时&…...
每日互动基于 Apache DolphinScheduler 从容应对ClickHouse 大数据入库瓶颈
引言 大家好,我叫张琦,来自每日互动,担任大数据平台架构师。今天我将分享我们团队在基于Apache DolphinScheduler实现ClickHouse零压入库过程中的实践经验。 这个实践项目涉及到两个关键组件:Apache DolphinScheduler和ClickHous…...
Chromium127编译指南 Linux篇 - 同步第三方库以及Hooks(六)
引言 在成功克隆 Chromium 源代码仓库并建立新分支之后,配置开发环境成为至关重要的下一步。这一过程涉及获取必要的第三方依赖库以及设置钩子(hooks),这些步骤对于确保后续的编译和开发工作能够顺利进行起着决定性作用。本指南旨…...
在 Android 设备上部署一个 LLM(大语言模型)并通过 Binder 通信提供服务
在 Android 设备上部署一个 LLM(大语言模型)并通过 Binder 通信提供服务,需要以下几个步骤。具体实现是通过定义一个 Android HAL 服务,并且在 init.rc 文件中启动该服务。我们将一步一步解释如何实现一个可通过 Binder 通信的服务(如 vendor.te.aimodel-service)。 一 …...
安科瑞AMB400分布式光纤测温系统解决方案--远程监控、预警,预防电气火灾
安科瑞戴婷 可找我Acrel-Fanny 安科瑞AMB400电缆分布式光纤测温具有多方面的特点和优势: 工作原理: 基于拉曼散射效应。激光器产生大功率的光脉冲,光在光纤中传播时会产生散射。携带有温度信息的拉曼散射光返回光路耦合器,耦…...
docker-compose安装rabbitmq 并开启延迟队列和管理面板插件(rabbitmq_delayed_message_exchange)
问题: 解决rabbitmq-plugins enable rabbitmq_delayed_message_exchange :plugins_not_found 我是在docker-compose环境部署的 services:rabbitmq:image: rabbitmq:4.0-managementrestart: alwayscontainer_name: rabbitmqports:- 5672:5672- 15672:156…...
低功耗蓝牙模块在车联网中的应用
目前,没有一种无线技术可以适合所有的车联网应用,目前对于距离短、功耗低、数据速率低的应用,最常见的选择是2.4G、红外和蓝牙技术。其中蓝牙5.0及以上版本受到大家的青睐,因为它与4.2版本相比通讯距离更长和数据吞吐量更高&#…...
Gitee push 文件
1、背景 想将自己的plecs仿真放到git中管理,以防丢失,以防乱改之后丢失之前版本仿真。此操作说明默认用户已下载git。 2、操作步骤 2.1 开启Git Bash 在文件夹中右键,开启Git Bash。 2.2 克隆文件 在Git Bash中打git clone git地址&#…...
OpenGL入门004——使用EBO绘制矩形
本节将利用EBO来绘制矩形 文章目录 一些概念EBO 实战简介utilswindowFactory.hRectangleModel.hRectangleModel.cpp main.cppCMakeLists.txt最终效果 一些概念 EBO 概述: Element Buffer Object 用于存储顶点的索引数据,以便在绘制图形时可以重用顶点数…...
Python中`__str__`和`__repr__`的区别(最清晰解释)
Python中__str__和__repr__的区别(最最最清晰的解释) 在Python的面向对象编程体系中,__str__和__repr__这两个特殊方法具有独特且重要的作用,尽管它们都涉及对象的字符串表示形式的定义,但在功能和使用场景上存在显著…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
