Linux工具【1】(编辑器vim、编译器gcc与g++)
vim详解
- 引言
- vim
- Vim的三种模式及模式切换
- 普通模式下操作
- 底行模式下操作
- gcc与g++
- gcc的使用(g++类似)
- 预编译
- 编译
- 汇编
- 链接
- 静态库与动态库
- 总结
引言
vim(vi improved)编辑器是从 vi 发展出来的一个文本编辑器。 代码补全、编译及错误跳转、语法高亮等方便编程的功能特别丰富,在程序员中被广泛使用。
vim 可以说是程序开发者的一项很好用的工具,它更是一个程序开发工具而不只是文字处理软件。
在vim中编辑代码可以使程序员的手指集中在键盘中央,从而提高效率。
在vim中编辑代码后,要执行代码就需要编译器,在Linux中使用gcc
与g++
编译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
文件中输入一些内容:
常用命令:
-
移动光标
小写英文字母h
、j
、k
、l
,分别控制光标左、下、上、右移一格:
G
:移动到文章的最后
$
:移动到光标所在行的“行尾”
^
:移动到光标所在行的“行首”
w
:光标跳到下个字的开头
e
:光标跳到下个字的字尾
b
:光标回到上个字的开头
#l
:光标移到该行的第#个位置
gg
:进入到文本开始
ctrl + b
:屏幕向后移动一页
ctrl + f
:屏幕向前移动一页
ctrl + u
:屏幕向后移动半页
ctrl + d
:屏幕向前移动半页
(移动光标的命令就不举例使用了) -
删除文字
x
:每按一次,删除光标所在位置的一个字符
#x
:表示删除光标所在位置的后(包含自己在内)#个字符
X
:每按一次,删除光标所在位置的前一个字符
#X
:表示删除光标所在位置的前#个字符
dd
:删除光标所在行
#dd
:从光标所在行开始删除#行
-
复制
yw
:将光标所在之处到字尾的字符复制到缓冲区中
#yw
:复制#个字到缓冲区
yy
:复制光标所在行到缓冲区。
#yy
:表示拷贝从光标所在行向下#行文字
p
:将缓冲区内的字符贴到光标所在位置
需要注意的是:所有与y
有关的复制命令都必须与p
配合才能完成复制与粘贴功能
-
替换
r
:替换光标所在处的字符。
R
:替换光标所到之处的字符,直到按下Esc
键为止。
-
撤销上一次操作
u
:回到上一个操作,按多次可以执行多次回复
ctrl + r
: 撤销的恢复 -
更改
cw
:更改光标所在处的字到字尾处
c#w
:表示更改#个字符 -
跳至指定的行
ctrl+g
: 列出光标所在行的行号
#G
:表示移动光标至文章的第#行行首
底行模式下操作
常用命令:
-
列出行号
set nu
: 在文件中的每一行前面列出行号。
(我使用的vim环境已经是配置过的,所以会默认显示行号) -
跳到文件中的某一行
#
:跳到第#行 -
查找字符
/关键字
: 先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按n
会往后寻找
?关键字
:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按n
会往前寻找 -
保存与退出
w
: 可以将文件保存起来,使用!
强制保存
q
:退出vim,后加!
强制离开vim
wq
:保存并退出
gcc与g++
在之前的C语言部分,我们知道我们所写的C代码要经过一系列处理为可执行程序后才能被系统执行,其中包括预编译、编译、汇编、链接
在Windows环境下我们经常使用Visual Studio、DevC、VC等开发环境环境进行代码的编写、编译与运行。而在Linux下我们使用vim
编写代码后,就使用gcc
与g++
编译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工具,希望大家持续关注哦
如果大家认为我对某一部分没有介绍清楚或者某一部分出了问题,欢迎大家在评论区提出
如果本文对你有帮助,希望一键三连哦
希望与大家共同进步哦
相关文章:

Linux工具【1】(编辑器vim、编译器gcc与g++)
vim详解 引言vimVim的三种模式及模式切换普通模式下操作底行模式下操作 gcc与ggcc的使用(g类似)预编译编译汇编链接静态库与动态库 总结 引言 vim(vi improved)编辑器是从 vi 发展出来的一个文本编辑器。 代码补全、编译及错误跳…...

基于Java+SpringBoot+vue前后端分离古典舞在线交流平台设计实现
博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…...

MQ - 闲聊MQ一二事儿 (Kafka、RocketMQ 、Pulsar )
文章目录 MQ的发展史阶段一:追求解耦阶段二:追求吞吐量与一致性阶段三:追求平台化 MQ的通用架构主题topic、生产者producer、消费者consumer分区partition MQ 存储KafkaGood Design ---> 磁盘顺序写盘Poor Impact---> topic 数量不能过…...
Qt中的 QIODevice类(包含:随机访问、顺序访问设备)
QIODevice类 一、简介 QIODevice用于对输入输出设备进行管理,是Qt中所有I/O设备的基接口类。为支持读写数据块的设备(如QFile、QBuffer和QTcpSocket)提供了通用实现和抽象接口。 输入设备有2种类型: 一种是随机访问设备,QFile(文件)和QBuff…...

【JavaScript 07】函数声明 地位平等 函数提升 属性方法 作用域 参数 arguments对象 闭包 IIFE立即调用函数表达式 eval命令
函数 1 概述1.1 声明1.2 重复声明 1.3 圆括号/return/recursion1.4 一等公民1.5 函数提升 2 函数属性与方法2.1 name属性2.2 length属性2.3 toString() 3 函数作用域3.1 概念3.2 函数内部变量提升3.3 函数本身作用域 4 参数4.1 概念4.2 省略4.3 传递4.4 同名4.5 arguments 对象…...

MyBatis源码分析_ResultSetHandler(7)
目录 1. 传统JDBC 2. Mybatis访问数据库 2.1 Statement访问数据库 2.2 火枪手 ResultSetHandler 出现 3. ResultSetHandler处理结果集 3.1 首先就是进入 handleResultSets 方法 3.2 handleResultSet 方法根据映射规则(resultMap)对结果集进行转化…...

Unittest加载执行用例的方法总结
前言 说到测试框架,unittest是我最先接触的自动化测试框架之一了, 而且也是用的时间最长的, unittest框架有很多方法加载用例,让我们针对不同的项目,不同项目的大小及用例的多少自己选择加载方式。今天我们就简单的说说…...

使用预训练的2D扩散模型改进3D成像
扩散模型已经成为一种新的生成高质量样本的生成模型,也被作为有效的逆问题求解器。然而,由于生成过程仍然处于相同的高维(即与数据维相同)空间中,极高的内存和计算成本导致模型尚未扩展到3D逆问题。在本文中࿰…...

微服务测试是什么?
微服务测试是一种特殊的测试类型,因为它涉及到多个独立的服务。以下是进行微服务测试的一般性步骤: 【B站最通俗易懂】Python接口自动化测试从入门到精通,超详细的进阶教程,看完这套视频就够了 1. 确定系统架构 了解微服务架构对…...
《现代C++教程》笔记(5-7)
文章目录 5 智能指针与内存管理5.1 RAII与引用计数5.2 std::shared_ptr5.3 std::unique_ptr5.4 std::weak_ptr 6 正则表达式7 并行与并发7.1 并行基础7.2 互斥量与临界区7.3 期物7.4 条件变量7.5 原子操作与内存模型 5 智能指针与内存管理 5.1 RAII与引用计数 在传统 C 中&am…...

红黑树深入剖析【C++】
目录 一、红黑树概念 二、红黑树节点结构设计 三、插入操作 处理情况1 处理情况2 处理情况3 插入总结: 四、插入操作源码 五、红黑树验证 一、红黑树概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色࿰…...

教育机构视频播放时观看行为分析有哪些应用?
教育机构视频播放时观看行为分析有哪些应用? 观看行为分析 观看行为分析是指我们平台基于视频大数据分析,能够以秒为粒度展示观众如何观看您的视频。 视频观看热力图是单次观看行为的图形化表示,我们平台云点播视频的每一次播放࿰…...

Jmeter+验证json结果是否正确小技巧
前言: 通过sql语句或者返回的参数,可以在查看结果树返回的结果中,用方法先跑一下验证是否取到自己想要的值 步骤: 1、添加查看结果树 2、跑出结果 3、在查看结果树中 text改成选Json Path Tester 返回的值如果是列表里面的字符…...
Spring 6.0官方文档示例(22): singleton类型的bean和prototype类型的bean协同工作的方法(一)
一、配置文件: <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:context"http://www.springframework.org/schema/context"xsi:schemaLocation"http…...

Android平台GB28181设备接入侧如何同时对外输出RTSP流?
技术背景 GB28181的应用场景非常广泛,如公共安全、交通管理、企业安全、教育、医疗等众多领域,细分场景可用于如执法记录仪、智能安全帽、智能监控、智慧零售、智慧教育、远程办公、明厨亮灶、智慧交通、智慧工地、雪亮工程、平安乡村、生产运输、车载终…...

el-Cascader 中div上绑定keyDown事件
keydown,keyup,keypress 事件默认是给页面上可以聚焦的元素绑定键盘事件,例如input输入框,点击输入框即代表聚焦在该元素上。那么想要给div或者其他不能聚焦的元素上使用键盘事件怎么处理呢?这里用到tabindex属性。 …...
elementUI 表格滚动分页加载请求数据
需求:elementui Table表格滚动分页(不使用分页组件),请求数据。 1、自定义加载更多数据的指令,在utils文件夹中创建 loadMore.js /*** 加载更多数据的指令*/ export default {install(Vue) {Vue.mixin({directives: …...

JAVA面试总结-Redis篇章(五)——持久化
Java面试总结-Redis篇章(五)——持久化 1.RDBRDB全称Redis Database Backup file (Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件&#x…...

【数据结构】·顺序表函数实现·赶紧学起来呀
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...

C++,类和对象-多态,制作饮品
#include<iostream> using namespace std;//多态案例,制作饮品class AbstractDrinking { public://煮水virtual void Boil() 0;//冲泡virtual void Brew() 0;//倒入茶杯virtual void PourInCup() 0;//加入辅料virtual void PutSomething() 0;//制作饮品vo…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...

如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...