【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   ----- 光标向左移动一位

  ----- 光标向下移动一行

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)

优点

  1. 独立性:生成的可执行文件不依赖于外部的库文件,能够在没有该库的环境中运行。
  2. 运行效率:由于不需要在运行时加载库,程序的启动时间较短。
  3. 稳定性:适用于不需要频繁更新库的场景,对于嵌入式系统或需要快速启动的应用,静态库也是一个不错的选择。

缺点

  1. 文件体积:可执行文件体积较大,因为它包含了所有的库代码。
  2. 更新复杂:如果库更新,所有依赖于该库的可执行文件都需要重新编译。
  3. 资源消耗:相同的库文件可能在内存中被加载多份,消耗系统资源,浪费内存。

动态库(.so)

优点

  1. 文件体积小:可执行文件相对较小,因为不包含库的所有代码。
  2. 易于更新:只需替换动态库文件即可更新,而不需要重新编译依赖该库的所有程序。
  3. 资源共享:动态库可以被多个程序共享使用,减少内存消耗。
  4. 灵活性:可以控制何时加载动态库,不调用库函数动态库不会被加载。

缺点

  1. 运行时依赖:如果缺少所需的动态库,程序无法运行。
  2. 加载时间:在启动时需要加载库,可能会稍微增加启动时间。
  3. 可移植性问题:程序的可移植性受到影响,如果想在不同的系统上使用动态库,可能需要用到专门的库兼容器。

总结来说,静态库提供了独立性和高性能,但代价是较大的文件体积和更新困难。动态库则更适合需要共享资源或频繁更新的项目,但依赖外部库文件。在实际开发中,了解这两者的特点,并根据项目的需求做出合适的选择,将有助于编写出更加高效和维护成本更低的代码。

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

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

相关文章

面试总结!

OSI七层模型&#xff1a; 什么是OSI七层模型&#xff1f; 我们需要了解互联网的本质是一系列的网络协议&#xff0c;这个协议就叫做OSI协议&#xff08;开放系统互联(Open System Interconnection&#xff09;&#xff09;&#xff0c;它是由ISO&#xff08;国际标准化组织&…

人工智能技术:未来生活的“魔法师”

想象一下&#xff0c;未来的某一天&#xff0c;你醒来时&#xff0c;智能助手已经为你准备好了早餐&#xff0c;你的智能家居系统根据你的心情和日程安排调整了室内的光线和音乐&#xff0c;而你的自动驾驶汽车已经在门口等你。这不是科幻小说&#xff0c;这是人工智能技术为我…

Multi Agents协作机制设计及实践

01 多智能体协作机制的背景概述 在前述博客中&#xff0c;我们利用LangChain、AutoGen等开发框架构建了一个数据多智能体的平台&#xff0c;并使用了LangChain的Multi-Agents框架。然而&#xff0c;在实施过程中&#xff0c;我们发现现有的框架存在一些局限性&#xff0c;这些…

100、Python并发编程:保护临界资源的最简单方式,加锁

引言 前面的文章中已经提到了并发编程中能够带来性能提升的同时&#xff0c;也带来了一些问题&#xff0c;比如对共享资源/临界资源的竞争&#xff0c;可能会导致状态的不一致。最终的结果是虽然性能提升了&#xff0c;但是结果却是错误的…… 所以&#xff0c;并发编程中一个…

PHP电商供应链ERP管理系统小程序源码

&#x1f680;电商供应链大揭秘&#xff01;ERP管理系统如何重塑你的商业版图✨ &#x1f50d; 什么是电商供应链ERP管理系统&#xff1f; 电商供应链ERP管理系统是一款基于FastAdminThinkPHP开发的系统。该系统可满足电商企业管理自身进销存&#xff0c;帮助中小型电商企业管…

python: Parent-child form operations using ttkbootstrap

# encoding: utf-8 # 版權所有 2024 ©塗聚文有限公司 # 許可資訊查看&#xff1a;言語成了邀功的功臣&#xff0c;還需要行爲每日來值班嗎&#xff1f; # 描述&#xff1a; 主、子表單 窗體傳值 Parent-child form operations # Author : geovindu,Geovin Du 塗聚文. …

跳表原理笔记

课程地址 跳表是一种基于随机化的有序数据结构&#xff0c;它提出是为了赋予有序单链表以 O(logn) 的快速查找和插入的能力 创建 首先在头部创建一个 sentinel 节点&#xff0c;然后在 L1 层采用“抛硬币”的方式来决定 L0 层的指针是否增长到 L1 层 例如上图中&#xff0c;L…

医院信息化与智能化系统(17)

医院信息化与智能化系统(17) 这里只描述对应过程&#xff0c;和可能遇到的问题及解决办法以及对应的参考链接&#xff0c;并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图&#xff0c;可以试试PlantUML&#xff0c;告诉GPT你的文件结构&#xff0c;让他给你对应…

selenium操作已开启的浏览器,方便调试

一、谷歌浏览器配置&#xff1a; 在所安装的谷歌下面&#xff0c;执行下面命令&#xff0c;打开谷歌浏览器&#xff0c;用来selenium的操作&#xff1a; 注意事项&#xff1a;端口需要不被占用&#xff0c;--user-data-dir"D:\workspace\chrome-data"这个路径需要有…

深度强化学习:从理论到应用

目录 1.引言 2.什么是强化学习&#xff1f; 3.深度学习和强化学习的结合 4.深度强化学习的主要方法 5.深度强化学习的应用领域 6.深度强化学习的挑战与未来 7.总结 1.引言 深度强化学习&#xff08;Deep Reinforcement Learning&#xff0c;DRL&#xff09;是近年来人工…

[Linux] 进程控制之创建和终止

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;青果大战linux 总有光环在陨落&#xff0c;总有新星在闪烁 每日吐槽 不得不说&a…

介绍一下rand函数生成随机数(c基础)

适合对象 c语言初学者 总结语言用色&#xff0c;个人强调用红色&#xff0c;注意为易错点&#xff0c;若有问题请告诉我谢谢。(建议通过目录观看)。一定要自己动手打代码。 rand函数 是生成随机数的函数&#xff0c;但实则是伪随机数。(即是同一个值) 格式 #include<st…

vue3入门知识(一)

vue3简介 性能的提升 打包大小减少41%初次渲染快55%&#xff0c;更新渲染快133%内存减少54% 源码的升级 使用Proxy代替defineProperty实现响应式重写虚拟DOM的实现和Tree-Shaking 新的特性 1. Composition API&#xff08;组合API&#xff09; setupref与reactivecomput…

FET113i-S核心板已支持RISC-V,打造国产化降本的更优解 -飞凌嵌入式

FET113i-S核心板是飞凌嵌入式基于全志T113-i处理器设计的国产工业级核心板&#xff0c;凭借卓越的稳定性和超高性价比&#xff0c;FET113i-S核心板得到了客户朋友们的广泛关注。作为一款拥有A7核RISC-V核DSP核的多核异构架构芯片&#xff0c;全志科技于近期释放了T113-i的RISC-…

C语言进阶:二.数据的存储(2)

❤个人主页❤&#xff1a;折枝寄北-CSDN博客 ❤学习专栏❤&#xff1a; C语言专栏&#xff1a;https://blog.csdn.net/2303_80170533/category_12794764.html?spm1001.2014.3001.5482https://blog.csdn.net/2303_80170533/category_12794764.html?spm1001.2014.3001.5482 在…

城市智慧公厕解决方案,建设城市智能化公厕

在城市的飞速发展进程中&#xff0c;公厕作为城市基础设施的重要一环&#xff0c;其智能化建设已成为提升城市品质与居民生活舒适度的关键举措。以下是关于城市智慧公厕的几点解决方案。 一、智能设施配备 首先&#xff0c;要引入智能化的卫生设备。例如&#xff0c;安装自动感…

【STL栈和队列】:高效数据结构的应用秘籍

前言&#xff1a; C 标准模板库&#xff08;STL&#xff09;为我们提供了多种容器&#xff0c;其中 stack&#xff08;栈&#xff09;和 queue&#xff08;队列&#xff09;是非常常用的两种容器。 根据之前C语言实现的栈和队列&#xff0c;&#xff08;如有遗忘&#xff0c;…

vue data变量之间相互赋值或进行数据联动

摘要&#xff1a; 使用vue时开发会用到data中是数据是相互驱动&#xff0c;经常会想到watch,computed&#xff0c;总结一下&#xff01; 直接赋值&#xff1a; 在 data 函数中定义的变量可以直接在方法中进行赋值。 export default {data() {return {a: 1,b: 2};},methods: {u…

HTML 基础标签——分组标签 <div>、<span> 和基础语义容器

文章目录 1. `<div>` 标签特点用途示例2. `<span>` 标签特点用途示例3. `<fieldset>` 标签特点用途示例4. `<section>` 标签特点用途示例5. `<article>` 标签特点用途示例总结HTML中的分组(容器)标签用于结构化内容,将页面元素组织成逻辑区域…

Java开发配置文件的详情教程配置文件类型

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…