编辑器vim和编译器gcc/g++
目录
一、编辑器vim
1、概念
2、基本操作
1、进入vim
2、模式切换
3、命令行模式
4、插入模式
5、底行模式
6、vim 的配置
二、编译器gcc/g++
1、概念
2、背景知识
3、gcc/g++中的编译链接
1、预处理
2、编译
3、汇编
4、链接
4、函数库
1、静态库
2、动态库
一、编辑器vim
1、概念
vim是一种常用于linux下的多模式编辑器。在vim中有好多模式,我们先了解这三种即可:分别是命令行模式(command mode)、插入模式(Insert mode)和底行模式(last line mode)。
1、正常/普通/命令模式(Normal mode)
控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode
2、插入模式(Insert mode)
只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。
3、底行模式(last line mode)
文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+: 即可进入该模式。
vim作为一种编辑器,它只能用来写代码,至于代码是否编译成功和是否能够运行成功,它一概不关注,它只能用来进行代码的编辑。
三种模式之间的切换:
注:q!(强转退出) ,wq(保存并退出)。
2、基本操作
1、进入vim
输入命令:vim 文件名。进入vim全屏幕编辑画面。进入之后是处于命令行模式,你要切换到插入模式才能够输入文字进行编辑。
2、模式切换
三种模式的切换见上图。
3、命令行模式
命令行模式下的常用命令:
1、yy:将光标当前所在行的内容进行复制。n yy:n表示具体整数,表示可以复制从该行开始的n行内容。
2、p:将复制的内容进行粘贴。n p:将复制的内容粘贴n行。
3、u:撤销操作。
4、ctrl + r:撤销u操作。
5、光标定位:
shift + g:将光标定位到文件的结尾。
gg:将光标定位到文件的开始。
n shift g :将光标定位到文件的任意一行。
shift + 6(^):将光标定位到当前行的最开始。
shift + 4($):将光标定位到当前行的结尾。
h、j、k、l:光标分别进行 左、下、上、右的操作。
6、dd:将光标所在行的内容删除。n dd:将光标所在行以及下面的n行内容删除。
dd + p:相当于剪切。
7、shift + ~:将字母进行大小写切换。
8、shift + r:进入替换模式。esc退出。
9、r:替换光标所在的字符。n r。
10、x or shift + x:删除光标所在的字符。n x。
4、插入模式
从命令行模式到插入模式:
1、按「i」切换进入插入模式「insert mode」,按“i”进入插入模式后是从光标当前位置开始输入文件。
2、按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字。
3、按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。
5、底行模式
底行模式下的命令:
1、set nu 或者 set nonu:调出或取消行号。
2、多屏操作
vs 文件名:就可以进入分屏操作模式。(光标在哪个分屏,就是可以操作的文件)。
ctrl + w(按两次):切换操作屏。
w:写入 q:退出。
:!命令:可以执行Linux下的命令(ll,man,./a.out,g++等)。在底行模式下还可以输入命令进行编译(g++)和运行。
6、vim 的配置
没有配置的vim用起来其实和记事本并没有多大的区别,不能自动补齐,也不能自动缩进,使用起来不是很方便。所以vim实际上是需要配置的。
但是配置vim比较麻烦,配置的东西比较多,作为刚入门的我们并不知道需要配置哪些东西,所以我们直接在家目录下执行一键配置的命令即可:
curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh
二、编译器gcc/g++
1、概念
gcc(g++)是一个专门用来编译链接C语言(C++)的编译器。
gcc只能编译c语言,g++可以编译c语言和c++。
2、背景知识
程序翻译的过程,本质上是将文本的C语言或其他语言转成计算机能够识别的二进制。转换过程:
1、预处理:去注释,进行宏替换,头文件展开,条件编译等。
2、编译:生成汇编语言(将C语言等语言编译成汇编语言)。
3、汇编:将汇编语言转换成可重定向二进制目标文件。
4、连接:生成可执行文件或库文件。将多个 .o文件(Linux下) 或 .obj(Windows下) 文件合并形成一个可执行文件 .exe(windows下)。
注:编译过程为 扫描程序-->语法分析-->语义分析-->源代码优化-->代码生成器-->目标代码优化。
1、扫描程序进行词法分析,从左向右,从上往下扫描源程序字符,识别出各个单词,确定单词类型。
2、语法分析是根据语法规则,将输入的语句构建出分析树,或者语法树,也就是分析树parse tree或者语法树syntax tree。
3、语义分析是根据上下文分析函数返回值类型是否对应这种语义检测,可以理解语法分析就是描述一个句子主宾谓是否符合规则,而语义用于检测句子的意思是否是正确的。
4、目标代码生成指的是,把中间代码变换成为特定机器上的低级语言代码。
3、gcc/g++中的编译链接
同样地,gcc/g++下也需要像上面那样一步一步形成最终的可执行文件。
语法:gcc 要编译的文件 -o 自己命名的可执行文件。如下:绿色的就是可执行文件。
zdl.c中的内容:
代码里面有宏,有头文件,有注释,有条件编译,可以验证我们接下来的内容。
1、预处理
但是,其实上面的做法是直接一步到位,直接形成了可执行程序。而我们为了验证gcc/g++是否会走上面的步骤,我们需要一步一步来看。所以我们要使用下面的命令:
gcc -E zdl.c -o test.i
-E:从现在开始,进行程序的翻译,如果预处理完成,就停下来。
上面的命令表示我们将预处理完成之后形成的内容写到了一个临时文件 test.i。所以预处理的内容(还是C语言)就在test.i中。如下:
我们发现842行的宏被替换了,注释也没有了,条件编译也执行了,头文件也展开了。
2、编译
接着我们执行下面的命令:将预处理完成的代码编译成汇编语言。
-S:从现在开始进行程序的翻译,如果编译完成,就停下来。
gcc -S test.i -o test.s
test.s就是汇编文件。
上图就是编译完成后汇编文件内容。
3、汇编
然后我们执行下面的命令:
gcc -c test.s -o test.o
-c:从现在开始进行程序的翻译,如果汇编完成,就停下来。
形成了二进制文件。test.o就是可重定向二进制目标文件。
我截取了其中一部分来看一看:
上图就是二进制文件的部分内容。
4、链接
最后对可重定向二进制目标文件进行链接,使用如下命令:
gcc test.o -o mytest
上图中,mytest就是最终的可执行程序,以及其执行结果。
4、函数库
首先,我们知道C/C++都有自己的标准库。
我们来看一个问题:在我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?
答案就是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。
这些库文件是现成的,是已经实现好了的,我们可以直接使用。当我们使用库中函数的时候,其中我们自己只是调用了该函数,没有真正地实现它,只有当链接的时候,对应的实现,才能和我们的代码关联起来。
一般链接的过程,有两种方式:1、动态链接(要动态库)2、静态链接(要静态库)。
1、静态库
静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”
静态链接:将库中方法的实现真的拷贝到我们的可执行程序中。
2、动态库
动态库是指在编译链接时,并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。
动态链接:将库中我要的方法的地址,填入我的可执行程序中,建立关联。
相关文章:

编辑器vim和编译器gcc/g++
目录 一、编辑器vim 1、概念 2、基本操作 1、进入vim 2、模式切换 3、命令行模式 4、插入模式 5、底行模式 6、vim 的配置 二、编译器gcc/g 1、概念 2、背景知识 3、gcc/g中的编译链接 1、预处理 2、编译 3、汇编 4、链接 4、函数库 1、静态库 2、动态库 一…...

linux 系统下文本编辑常用的命令
一、是什么 Vim是从 vi 发展出来的一个文本编辑器,代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。 简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方 而…...

3D Gaussian Splatting文件的压缩【3D高斯泼溅】
在上一篇文章中,我开始研究高斯泼溅(3DGS:3D Gaussian Splatting)。 它的问题之一是数据集并不小。 渲染图看起来不错。 但“自行车”、“卡车”、“花园”数据集分别是一个 1.42GB、0.59GB、1.35GB 的 PLY 文件。 它们几乎按原样…...

Spring Boot 整合xxl-job实现分布式定时任务
xxl-job介绍 XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 xxl是xxl-job的开发者大众点评的许雪里名称的拼音开头。 设计思想 将调度行为抽象形成“调度…...

16.最接近的三数之和
题目来源: leetcode题目,网址:16. 最接近的三数之和 - 力扣(LeetCode) 解题思路: 对数组排序后,枚举第一个值,利用双指针在第一个值固定时的第二三个值。 解题代码:…...

php 插入排序算法实现
插入排序是一种简单直观的排序算法,它的基本思想是将一个数据序列分为有序区和无序区,每次从无序区选择一个元素插入到有序区的合适位置,直到整个序列有序为止 5, 3, 8, 2, 0, 1 HP中可以使用以下代码实现插入排序算法: functi…...

import gradio时出现SyntaxError: future feature annotations is not defined解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

视频封装格式
FLV(Flash Video) FLV封装格式 Tag Data分为Audio,Video,Script三种 TS(Transport Stream)传输流 TS文件分为三层,(倒叙更好理解) TS层:在PES层基础上加入…...

vue+iView实现下载zip文件导出多个excel表格
1,需求:在vue项目中,实现分月份导出多个Excel表格。 点击导出,下载zip文件,解压出多张表数据。 2,关键代码: <Button class"export button-style button-space" click"ex…...

Rust编程中的共享状态并发执行
1.共享状态并发 虽然消息传递是一个很好的处理并发的方式,但并不是唯一一个。另一种方式是让多个线程拥有相同的共享数据。在学习Go语言编程过程中大家应该听到过一句口号:"不要通过共享内存来通讯"。 在某种程度上,任何编程语言中的信道都类…...

python语法之数据类型
在python编程中,数据类型是一个重要的概念。 变量可以存储不同类型的数据,不同的类型可以做不同的事情。 Python在这些类别中默认内置了以下数据类型: 文本类型:str数值类型:int, float, complex序列类型:list, tup…...

Skybox天空盒子的更换教程_unity基础开发教程
Skybox天空盒子的更换 Skybox的下载与导入更换SkyboxSkybox属性自定义 Skybox的下载与导入 打开资源商店 搜索FREE Skybox 这里是我使用的是这一款资源,点击添加至我的资源 打开包管理器Package Manager Packages选择My Assets 搜索Sky 选择刚刚添加的天空盒子 点…...

Android模拟器的linux内核源码的下载
文章目录 Android模拟器的linux内核源码的下载 Android模拟器的linux内核源码的下载 git clone https://aosp.tuna.tsinghua.edu.cn/android/kernel/goldfish.git自己新建一个文件夹存放内核代码,命名随意。 切换一下分支就有东西了 切换到下面这个分支...

Vue中methods实现原理
目录 前言 回调函数中的this指向问题 vue实例访问methods methods实现原理 前言 vue实例对象为什么可以访问methods中的函数方法?methods的实现原理是什么? 回调函数中的this指向问题 在解答前言中的问题前,需要了解一下回调函数中的th…...

维基百科是非营利性机构 词条内容具有中立性、准确性、可靠性
维基百科对一些企业很有神秘性,自行操作很多次也没有成功建立维基百科,这一定是没有按照维基百科的规则和流程去操作。小马识途营销顾问提醒企业,维基百科是一种基于协作的在线百科全书,由维基媒体基金会运营。维基百科的创建流程…...

C/C++轻量级并发TCP服务器框架Zinx-框架开发002: 定义通道抽象类
文章目录 2 类图设计3 时序图数据输入处理:输出数据处理总流程 4 主要实现的功能4.1 kernel类:基于epoll调度所有通道4.2 通道抽象类:4.3 标准输入通道子类4.4 标准输出通道子类4.5 kernel和通道类的调用 5 代码设计5.1 框架头文件5.2 框架实…...

bin、hex、ELF文件格式上的区别
bin, hex, 和 ELF 是三种不同的文件格式,主要用于表示和存储二进制数据和程序代码。它们各自有其用途、特点和格式: bin (Binary) 文件: 通常表示纯二进制格式的文件。它不包含任何元数据或文件结构,只是简单地按照字节顺序存储数据。这种文件…...

《QT从基础到进阶·二十六》绘制多个图形项(QGraphicsRectItem,QGraphicsLineItem,QGraphicsPolygonItem)
这个demo用QT实现了对多个图形项的绘制,包括矩形的绘制,直线的绘制和多边形的绘制,是之前一章中绘制矩形的增强版,之前一章节关于矩形的绘制可以参考:《QT从基础到进阶十五》用鼠标绘制矩形(QGraphicsView、…...

【分布式】CAP理论详解
一、CAP理论概述 在分布式系统中,CAP是指一组原则,它们描述了在网络分区(Partition)时,分布式系统能够提供的保证。CAP代表Consistency(一致性)、Availability(可用性)和…...

AI歌姬,C位出道,基于PaddleHub/Diffsinger实现音频歌声合成操作(Python3.10)
懂乐理的音乐专业人士可以通过写乐谱并通过乐器演奏来展示他们的音乐创意和构思,但不识谱的素人如果也想跨界玩儿音乐,那么门槛儿就有点高了。但随着人工智能技术的快速迭代,现在任何一个人都可以成为“创作型歌手”,即自主创作并…...

ZooKeeper基本知识
1.什么是ZooKeeper ZooKeeper是一个开源的分布式协调服务,它提供了一个高性能、高可靠的分布式协调基础,用于构建分布式系统。 具体来说,ZooKeeper通常用于以下几个方面: 配置管理:分布式系统通常需要集中管理配置信…...

leetcode:138. 随机链表的复制
一、题目: 138. 随机链表的复制 - 力扣(LeetCode) 函数原型: struct Node* copyRandomList(struct Node* head) 二、思路 本题是给出一个单链表,单链表的每个结点还额外有一个随机指针,随机指向其他结点&am…...

SpringBoot 全局异常之参数校验(1)
文章目录 前言背景依赖校验类型@NotBlank、@NotNull和@NotEmpty的区别@Valid和@Validated区别异常处理方式一 @RequestParam全局异常处理(ConstraintViolationException)请求示例方式二 @RequestBody(推荐)全局异常处理(MethodArgumentNotValidException)请求示例方式三(…...

QT windows与linux之间sokcet通信中文乱码问题解决方法
QT windows与linux之间sokcet通信中文乱码问题解决方法 linux发送与接收都转码utf-8: tcpClient ->write( send_msg.toUtf8());//解决乱码,发送转码 接收: QByteArray buffer tcpClient->readAll(); if(!buffer.isEmpty()) { // ui->plain…...

Java实现DXF文件转换成PDF
代码实现 public static void dxfToPdf(){// 加载DXF文件String inputFile "input.dxf";CadImage cadImage (CadImage) Image.load(inputFile);// 设置PDF输出选项PdfOptions pdfOptions new PdfOptions();pdfOptions.setPageWidth(200);pdfOptions.setPageHeigh…...

揭秘Vue中的nextTick:异步更新队列背后的技术原理大揭秘!
🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 ⭐ 专栏简介 📘 文章引言 一、N…...

PHP使用文件缓存实现html静态化
<?php // 动态生成的内容 $content "<html><body><h1>time:".date("Y-m-d H:i:s")."</h1></body></html>"; // 静态文件保存路径和文件名 $staticFilePath "file.html"; if(file_exists($s…...

A Gentle Introduction to Graph Neural Networks
A Gentle Introduction to Graph Neural Networks----《图神经网络入门》 图神经网络信息传递积累 图在我们身边随处可见,现实世界中的物体通常是根据它们与其他事物的联系来定义的。一组物体以及它们之间的联系可以很自然地用图来表示。十多年来,研究人…...

详解[ZJCTF 2019]NiZhuanSiWei 1(PHP两种伪协议、PHP反序列化漏洞、PHP强比较)还有那道题有这么经典?
题目环境: <?php $text $_GET["text"]; $file $_GET["file"]; $password $_GET["password"]; if(isset($text)&&(file_get_contents($text,r)"welcome to the zjctf")){echo "<br><h1>&…...

bazel build使用【未完】
1. install install的作用:将生成的目标、文件复制到指定的安装目录中,可以是可执行文件、库文件、 配置文件等 若有一个c可执行文件,可以使用install将其安装到标准的可执行路径中,以便于直接运行,而无需指定完整的文…...