Linux开发工具的使用(vim、gcc/g++)

news2024/11/27 16:51:46

文章目录

  • vim
    • vim基本概念
    • vim的常用三种模式
    • vim三种模式的相互转换
    • vim命令模式下的命令集
      • 移动光标
      • 删除文字
      • 剪切/删除
      • 复制
      • 替换
      • 撤销和恢复
      • 跳转至指定行
    • vim底行模式下的命令集
  • gcc/g++
    • gcc/g++的作用
    • gcc/g++的语法
    • 预处理
    • 编译
    • 汇编
    • 链接
    • 函数库
      • 动静态库
      • 动态链接的优缺点
    • 静态链接的优缺点

vim

vim基本概念

vim是Linux下的一个多模式的编译器 简单来说就是写代码的工具 不提供编译调试等功能
有语法高亮功能 可视化操作不仅可以在终端运行 还可以运行与x windows mac os windows

vim的常用三种模式

在这里插入图片描述

1、命令模式
控制光标的移动 字符,字或行 的删除 ,移动复制某区段
以及切换到插入模式和底行模式下
2、插入模式(使用最频繁的模式)
只有在插入模式下 才可以进行文字的输入
以及切换到命令模式
3、底行模式
文件保存或退出 也可以进行 文件替换 找字符串 列出行号等
以及切换到命令模式

vim三种模式的相互转换

在这里插入图片描述
命令模式切换到插入模式
输入a:进入插入模式后 从目标光标所在位置的下一个位置开始输入文字
输入i: 进入插入模式后 从光标当前位置开始输入
输入0:进入插入模式后 插入新的一行 从行首开始输入文字
命令模式 切换到底行模式
输入shift+;
插入模式/底行模式切换命令模式
按ESC即可
插入模式和底行模式之间不能相互转换

vim命令模式下的命令集

移动光标

  • vim可以直接使用键盘来控制光标的上下左右移动,正规的vim使用的是小写字母h j k l 分别控制光标左下上右移动一格 也可以使用方向键进行移动
  • G :移动到文章的最后
  • gg:进入到文本开始
  • $(shift+4):移动到光标所在行的行尾
  • ^(shift+6):移动到光标所在行的行首
  • n+Enter:光标向下移动n行
  • n+l:光标进去到改行的第n个位置
  • ctrl+b :屏幕向前翻一页
  • ctrl+f:屏幕向后翻一页
  • ctrl+u:屏幕向前翻半页
  • ctrl+d:屏幕向后翻半页
  • w:光标进入到下个字的开头
  • e:光标进入到下个字的自尾
  • b:光标回到上个字的开头

删除文字

  • x:每按一次删除光标所在位置一个字符
  • n+x:删除光标所在位置后面的n个字符
  • X:删除光标所在位置前一个字符
  • n+X:删除光标所在位置后前面的n个字符

剪切/删除

  • dd:剪切/删除光标所在行
  • n+dd:从光标所在行开始剪切/删除n行
  • p:将剪切的内容复制到光标所在位置下一行
  • n+p:将剪切的内容复制到光标所在位置下一行开始复制n行

复制

  • yy:复制光标所在行到缓冲区
  • n+yy:复制从光标所在行往下数n行字符到缓冲区
  • p:将缓冲区的字符粘贴到光标所在位置下一行
  • yw:将光标所在位置到字尾的字符复制到缓冲区
  • n+yw:复制n个字到缓冲区

替换

  • r: 替换光标所在处的字符
  • R:替换光标所在位置的字符 直到按下esc停止uu
  • ctrl+~:快速切换大小写

撤销和恢复

  • u:撤销
  • ctrl+r:恢复

跳转至指定行

  • n+G:移动到第n行行首

vim底行模式下的命令集

在使用底行模式之前 先按ESC键确定自己处于命令模式 然后再按shift+;进入底行模式

  • 输入 set nu:按回车后在文件中的每一行前列出行号
  • 输入 set nonu:按回车后在文件中的取消列出的行号
  • 输入数字:按回车后就会跳转到该行行首
  • 输入w:保存文件
  • 输入w!:强制保存
  • 输入q:退出文件
  • 输入q!:强制退出文件
  • 输入wq:保存并退出文件
  • 输入vs+文件名:进行多文件操作
  • 输入ctrl+ww:光标在不同文件中切换
  • !+其他指令 :在不退出vim的情况下执行Linux其他命令

gcc/g++

gcc/g++的作用

gcc/g++分别是GUN中的c和c++编译器
对于 .c和.cpp文件,gcc分别当做c和cpp文件编译(c和cpp的语法强度是不一样的)
对于 .c和.cpp文件,g++则统一当做cpp文件编译

在使用gcc之前 应该了解一个.c源文件到一个.exe可执行程序经历了哪些过程和函数库 # 程序编译链接的四个过程

  1. 预处理
    完成头文件的展开 删去注释 宏替换等工作
  2. 编译
    将源代码翻译成汇编语言 语法分析 词法分析 语义分析等
  3. 汇编
    汇编代码转换成为二进制指令产生目标文件
  4. 链接
    将汇编过程产生的二进制指令进行连接 生成可执行程序

gcc/g++的语法

gcc/g++ 选项 文件
常用选项:
-E :只进行预处理 不会生成文件 需要自己重定向到一个文件里
-S: 编译到汇编语言(生成.s文件) 不进行汇编和链接
-c:编译到目标文件 (生成.o文件) 不进行链接
-o:将执行结果输出到指定文件中
-static:对生成的文件采用静态链接

预处理

gcc -E -o test.i test.c
将源文件test.c进行预处理后停止 将是执行结果输出到test.i文件中
在这里插入图片描述
可以看到预处理阶段完成了头文件的展开 删去注释 宏替换等工作

编译

gcc -S test.s
将预处理阶段产生的test.i文件编译产生.s汇编文件
在这里插入图片描述
在这里插入图片描述

汇编

gcc -c test.s
将汇编文件test.s编译成产生.o目标文件
在这里插入图片描述
在这里插入图片描述

链接

gcc test.o
将目标文件链接产生可执行程序a.out
在这里插入图片描述
如果你也和我一样 不喜欢a.out 用-o进行重定向gcc -o test.exe test.o
在这里插入图片描述
可执行程序也是二进制指令
在这里插入图片描述

函数库

我们在c程序中,并没有实现printf函数,且在预编译中包含的头文件stiod.h中也仅仅只是有该函数的声明 并没有定以实现该函数 那么printf函数在哪里实现的呢?
在Linux中 系统把这些函数都实现在一个名为libc.so.6(Linux中的一个动态链接库 包含了标准c库的实现)的文件中 在没有特别指定时 gcc会到系统默认的路径’‘/usr/lib’'下进行查找,也就是链接到libc.so.6库函数中去 这样就能实现函数printf了 这也就是链接的作用
库函数一般分为静态库和动态库

动静态库

  • 静态库是指在编译链接时 把库文件的代码全部加入到可执行文件中 因此生成的可执行程序文件会比较大 但在运行时也就不需要库文件了在linux下后缀名一般为.a windows中后缀名为.lib
  • 动态库则是在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库 这样可以节省系统的开销 在Linux下后缀为.so windows后缀为.dll 前面所说的libc.so.6就是动态库
  • gcc在编译时默认使用动态链接(使用file命令验证)

file 命令
语法: file 文件名
功能: 辨识文件类型
在这里插入图片描述
gcc/g++在编译时默认采用动态链接 我们也可以加上-static选项使用静态链接的方式编译
gcc -o newtest.exe test.c -static
在这里插入图片描述
采用静态链接 可执行程序会比较大
我们也可以查看一个可执行程序所依赖的库(使用ldd命令)

ldd 命令
语法: ldd 可执行程序
功能: 查看一个可执行程序依赖的库

在这里插入图片描述

动态链接的优缺点

在这里插入图片描述

静态链接的优缺点

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

注意,注意,weak_ptr有坑

class Test { public:Test(){cout << "构造函数\n";}~Test(){cout << "析构函数\n";} }; void *operator new(size_t nsize) {void *ptmp std::malloc(nsize);printf("申请内存:%d,%p\n",nsize, ptmp);return ptmp; }void operator…

【油猴脚本】学习笔记

目录 新建用户脚本模板源注释 测试代码获取图标 Tampermonkey v4.19.0 原教程&#xff1a;手写油猴脚本&#xff0c;几分钟学会新技能——王子周棋洛   Tampermonkey首页   面向 Web 开发者的文档   Greasy Fork 新建用户脚本 打开【管理面板】 点击【】&#xff0c;即…

微服务使用指南

微服务使用指南 1.初识微服务 微服务可以认为是一种分布式架构的解决方案&#xff0c;提供服务的独立性和完整性&#xff0c;做到服务的高内聚、低耦合。 目前服务架构主要包含&#xff1a;单体架构和分布式架构。 1.1 单体架构 单体架构&#xff1a;把所有业务功能模块都…

YoloV8目标检测与实例分割——目标检测onnx模型推理

一、模型转换 1.onnxruntime ONNX Runtime&#xff08;ONNX Runtime或ORT&#xff09;是一个开源的高性能推理引擎&#xff0c;用于部署和运行机器学习模型。它的设计目标是优化执行使用Open Neural Network Exchange&#xff08;ONNX&#xff09;格式定义的模型&#xff0c;…

微信怎么批量保存大量照片

8-2 本文要解决的问题是自动或者快速地保存微信收到的图片的事情&#xff0c;如果你的工作中有一个事情是需要每天或者经常保存大量的从微信收到的图片或者视频的&#xff0c;也许本文适合你&#xff0c;本文介绍的方法&#xff0c;可以自动保存各个群或者人发来的图片和视频。…

【LeetCode每日一题合集】2023.9.18-2023.9.24(⭐拓扑排序⭐设计数据结构:LRU缓存实现 LinkedHashMap⭐)

文章目录 337. 打家劫舍 III&#xff08;树形DP&#xff09;2560. 打家劫舍 IV&#xff08;二分查找动态规划&#xff09;LCP 06. 拿硬币&#xff08;简单贪心模拟&#xff09;2603. 收集树中金币⭐思路——拓扑排序删边 2591. 将钱分给最多的儿童&#xff08;分类讨论&#xf…

MATLAB_5MW风电永磁直驱发电机-1200V直流并网MATLAB仿真模型

仿真软件&#xff1a;matlab2016b 风机传动模块、PMSG模块、蓄电池模块、超级电容模块、无穷大电源、蓄电池控制、风机控制、逆变器控制等模块。 逆变器输出电压&#xff1a; 混合储能系统SOC&#xff1a; 威♥关注“电击小子程高兴的MATLAB小屋”获取更多精彩资料&#xff0…

String的几个常见面试题及其解析

String s3 new String("a") new String("b")会不会在常量池中创建对象&#xff1f; 答案&#xff1a;不会&#xff0c;首先需要解释“”字符串拼接的理解。 采用 运算符拼接字符串时&#xff1a; 如果拼接的都是字符串直接量&#xff0c;则在编译时编…

基于信号功率谱特征和GRNN广义回归神经网络的信号调制类型识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ................................................................ %调制识别 len1 func_f…

【代码】【5 二叉树】d3

关键字&#xff1a; 非叶子结点数、k层叶子结点数、层次遍历、找双亲结点、找度为1、叶子结点数

MySQL EXPLAIN查看执行计划

MySQL 执⾏计划是 MySQL 查询优化器分析 SQL 查询时⽣成的⼀份详细计划&#xff0c;包括表如何连 接、是否⾛索引、表扫描⾏数等。通过这份执⾏计划&#xff0c;我们可以分析这条 SQL 查询中存在的 问题&#xff08;如是否出现全表扫描&#xff09;&#xff0c;从⽽进⾏针对优化…

好用的MybatisX插件~

MybatisX插件&#xff1a; MyBatis-Plus为我们提供了强大的mapper和service模板&#xff0c;能够大大的提高开发效率。但是在真正开发过程中&#xff0c;MyBatis-Plus并不能为我们解决所有问题&#xff0c;例如一些复杂的SQL&#xff0c;多表联查&#xff0c;我们就需要自己去…

Web前端—网页制作(以“学成在线”为例)

版本说明 当前版本号[20231105]。 版本修改说明20231105初版 目录 文章目录 版本说明目录day07-学成在线01-项目目录02-版心居中03-布局思路04-header区域-整体布局HTML结构CSS样式 05-header区域-logo06-header区域-导航HTML结构CSS样式 07-header区域-搜索布局HTML结构CSS…

Gin学习笔记

Gin学习笔记 Gin文档&#xff1a;https://pkg.go.dev/github.com/gin-gonic/gin 1、快速入门 1.1、安装Gin go get -u github.com/gin-gonic/gin1.2、main.go package mainimport ("github.com/gin-gonic/gin""net/http" )func main() {// 创建路由引…

打通你学习C语言的任督二脉-函数栈帧的创建和销毁(上)

&#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏:C语言学习&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 待解决疑惑: 局部变量是怎么创建的? 为什么局部变量的值是随机值? 函数是怎么传参的?传参的顺序是怎样的? 形参和实参是什么关系? 函数调…

3.25每日一题(知线性常系数方程的特解求线性方程)

思路&#xff1a;通过特解可以知道特征根&#xff0c;通过特征根可以求出特征方程&#xff0c;通过特征方程可以求出线性方程

C语言strcat函数再学习

之前学习了strcat函数&#xff1b;下面继续学习此函数&#xff1b; 它的功能描述是&#xff0c; 功能 把src所指向的字符串&#xff08;包括“\0”&#xff09;复制到dest所指向的字符串后面&#xff08;删除*dest原来末尾的“\0”&#xff09;。要保证*dest足够长&#xff0…

【数智化人物展】觉非科技CEO李东旻:数据闭环,智能驾驶数智时代发展的新引擎...

李东旻 本文由觉非科技CEO李东旻投递并参与《2023中国企业数智化转型升级先锋人物》榜单/奖项评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 数智化的主要作用是帮助决策。它的核心是大数据&#xff0c;以大数据为基础&#xff0c;匹配合适的AI技术&#xff0c;促使数…

Framebuffer 介绍和应用编程

前言&#xff1a; 使用的开发板为韦东山老师的 IMX6ULL 目录 Framebuffer介绍 LCD 操作原理 涉及的 API 函数 1.open 函数 2.ioctl 函数 3.mmap 函数 Framebuffer 程序分析 1.打开设备 2.获取 LCD 参数 3.映射 Framebuffer 4.描点函数 5.随便画几个点 6.上机实验…

一个高性能类型安全的.NET枚举实用开源库

从零构建.Net前后端分离项目 枚举应该是我们编程中&#xff0c;必不可少的了&#xff0c;今天推荐一个.NET枚举实用开源库&#xff0c;它提供许多方便的扩展方法&#xff0c;方便开发者使用开发。 01 项目简介 Enums.NET是一个.NET枚举实用程序库&#xff0c;专注于为枚举提…