【hello Linux】Linux开发工具

目录

1. vim:文本编辑器

1.1 各种模式的切换

补充:ctrl r命令

1.2 命令模式的操作

1.3 插入模式的操作

1.4 底行模式的操作

1.5 配置vim环境

1.6 配置亲属关系

2. gcc/g++:编译器

2.1 预处理:

2.2 编译:

2.3 汇编:

2.4 链接:

2.5 执行可执行程序

2.6 函数库

3. gdb:调试器

3.1 调试:gdb 可执行文件 

3.2 调试命令的使用


 

Linux🌷 

在windows系统平台下,我们可以使用vs2019等软件进行代码的编写、编译、调试以及运行,这种软件都是集成开发软件。

那么在Linux系统下呢?我们

编写代码使用:vim(文本编辑器);

编译代码使用:gcc/g++(编译器);

调试代码使用:gdb(调试器);

下面系统的介绍下各种工具的使用。

1. vim:文本编辑器

vim是一种文本编辑器,从定位上来说和记事本没有任何差别,但经过配置后的vim却能够很好的帮助我们在Linux系统环境下进行代码的编写。

 

 vim还是一种多模式的编辑器。

我们常常使用以下三种模式完成代码的编写:命令模式、插入模式、底行模式。

1.1 各种模式的切换

1. 我们刚进入vim时默认是在命令模式的;

2. 按键盘上的 i 键便可以进入插入模式;

3. 按左上角的Esc键便可以返回到命令模式;

4. 在命令模式下按 shift : 进入底行模式;

5. 在底行模式下输入 :wq! 回车退出vim。

其中 w:保存,q:退出,!:强制

下面一个图解进行更好的梳理:

 补充:ctrl r命令

按住ctrl r后会出现上述情况,我们之间输入原先命令的部分片段,则会出来原先全部的命令

1.2 命令模式的操作

移动光标:

上下左右(键盘),HJKL  左下上右

shift ^   光标定位至行首; shift $  光标定位至行尾

gg   光标定位至起始行; shift g   光标定位至末尾行;12 shift g   光标定位至12行;

w    向后移动一个单词;  b   向前移动一个单词; (这两个并不绝对是以一个单词为单位的)

文本操作:

yy    复制当前行(光标所在的位置)

2yy  复制当前行及其之后的一行(支持多行操作)

p      粘贴

np    一次重复粘贴n行

u      撤销

dd    剪切当前行(光标所在的位置)

nyy  剪切当前行及其之后的n-1行(支持多行操作)

shift ~    大小写转换(光标所在的字符)若:大写—>小写;小写—>大写

x      删除光标所在位置的字符(支持nx)

X     删除光标所在位置的前一个字符(支持nX)

r      替换当前光标所在的字符(支持nr—>所在+后n-1都替换为同一字符)

shift r   直接进入替换模式,进行多个内容的替换,按Esc返回命令模式

ctrl r     撤销刚刚的撤销

 

1.3 插入模式的操作

i   在光标所在处进入

a  在光标所在处的右一字符处进入

o  在光标所在行下建一空行进入,光标在新建行的行首

 

1.4 底行模式的操作

set nu        调出行号

set nonu    取消行号

w               保存

q                退出

!                 强制

vs 文件名   多文件操作

ctrl w w   在两屏中切换光标

在底行模式下wq退出的是光标所在屏

1.5 配置vim环境

在没有配置vim环境时,打开使用vim编辑代码则相当于使用记事本,

配置了vim环境则是在编写代码时有适当的缩进、高光、括号配对等。

可以使用如下命令进行简单环境的配置(足够使用):

curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh

注意:

要在自己的用户下进行配置

出现如下所示则代表成功 

 vim配置在自己的文件中,只会影响自己的操作;

对于root用户也一样,root有自己的vim配置文件,只影响自己。

1.6 配置亲属关系

在root用户下使用下面命令:

vim /etc/sudoers

 对文件进行如下配置:

 此后我们便可以使用sudo命令(提升普通用户的权限):

 

2. gcc/g++:编译器

编译器主要完成四个功能:预处理、编译、汇编、链接。

下面看一下它们的具体功能:

预处理:头文件的展开、宏替换、条件编译、去掉注释;

编译:检查代码是否有语法错误,将代码翻译成汇编语言;

汇编:将汇编代码转化为机器可识别的二进制代码文件;

链接:生成可执行文件或库文件。

下面看一下它们到底怎么使用吧!

2.1 预处理:

 -E      开始进行翻译,完成预处理之后停下来!

 -o       指定特定的文件

hello.i  .i后缀表已经过预处理的C原始程序

2.2 编译:

 -S      开始进行翻译,完成编译之后停下来!

 -o       指定特定的文件

hello.s  .s后缀表已经过编译的C原始程序,生成汇编代码了

2.3 汇编:

 -c      开始进行翻译,完成汇编之后停下来!

 -o       指定特定的文件

hello.o  .o后缀表已经过汇编的C原始程序,生成二进制的目标代码了

2.4 链接:

hello  链接生成的可执行程序

2.5 执行可执行程序

 2.6 函数库

函数库一般分静态库动态库两种。

静态库:.a后缀
静态库是指编译链接时, 把库文件的代码全部加入到可执行文件中, 因此生成的文件比较大, 但在运行时也就不再需要库文件了。其后缀名一般为“.a”
动态库:.so后缀
动态库与之相反, 在编译链接时并没有把库文件的代码加入到可执行文件中, 而是在程序执行时由
运行时链接文件加载库, 这样可以节省系统的开销。动态库一般后缀名为 “.so”

 

ldd 可执行程序:

 由此可知,gcc默认是以动态链接方式,形成可执行程序

3. gdb:调试器

3.1 调试:gdb 可执行文件 

 由上述命令我们便可以进入到Linux系统下的调试功能

程序的发布方式有两种, debug 模式和 release 模式
Linux gcc/g++ 出来的二进制程序,默认是 release 模式
要使用 gdb 调试,必须在源代码生成二进制程序的时候 , 加上 - g 选项

 3.2 调试命令的使用

run 直接执行(相当于vs中的F5) 

list 显示代码(l也可用于显示代码)(一般是从main函数上下行进行显示),若后面直接跟 l 则续上之前显示的行继续显示

l 行号(从此行号上下行显示代码)

 b 行号(给第几行打断点)

s 逐步执行(相当于F11)

n 逐过程执行(相当于F10) 

display 要显示的内容:常显示

undisplay 行号:取消常显示

p/P 要显示的内容:只显示一次

 finish (结束当前的函数,跑完函数并退出,类似于break)

 continue (直接到达下一个断点处)

 info b (显示断点信息)

d 行号(删除对应行处的断点)

disable 行号(禁用对应行处的断点)

enable 行号(打开对应行处的断点) 

 until 行号(在一个函数内部直接到达指定行)

 set var 要修改的内容(修改对应的值)

 bt (查看栈参数)

 

坚持打卡!😃

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

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

相关文章

如何利用ChatGPT辅助优化刷题性能

根据土著刷题共建群里的一个小伙伴反馈,刷题会出现切题卡顿的情况,有时会出现滑不动的情况。 定位问题 为了定位切题卡顿问题的具体原因,测试了高低端手机📱、切换2G、3G、4G低网络状态等各种影响切题的现实情况,经过借…

STM32F4_定时器精讲(TIM)

目录 1. 什么是定时器? 2. STM32定时器简介 2.1 高级控制定时器 TIM1和TIM8 2.1.1 TIM1和TIM8简介 2.1.2 时基单元 2.1.3 计数器模式 2.1.4 重复计数器 2.1.5 时钟选择 2.1.6 捕获/比较通道 2.1.7 输入捕获模式 2.1.8 其他功能 2.2 通用定时器 TIM2到TI…

Mysql 你还在一个字段一个索引吗

今天看到某系统的mysql在某时段存在thread_running线程数飙高触发告警,挤时间分析了该异常时间段的慢日志记录,并进行了sql优化 慢日志记录主要归为3个慢sql (编号1,2,3) 一、 1号sql原文 select * from feeds where topics_id &…

【MySQL数据库原理】MySQL Community安装与配置

目录 安装成功之后查看版本验证1、介绍、安装与配置数据库2、操作MySQL数据库3、MySQL数据库原理安装成功之后查看版本验证 SELECT VERSION();查看mysql版本号 1、介绍、安装与配置数据库 下载安装包:https://download.csdn.net/download/weixin_41194129/87672588 MySQL…

Visual studio C#中通过nuget安装sqlite库及C#中sliqte的用法

以前在Visual studio 的2017版中讲过如何使用sqlite,这里我们再次说说如何使用sqlite,以前Nuget使用还不是很流行很普及,大多数人不知道,但随着VS的升级,Nuget成为安装插件或者引用库文件标准的获取手段,所…

Qt Quick - TabBar

Qt Quick - TabBar使用总结一、概述二、调整选项卡三、Flickable标签三、定制化一、概述 TabBar其实就是选项卡,TabBar是由TabButton控件填充,TabBar可以与任何提供currentIndex属性的布局或容器控件一起使用,如StackLayout或SwipeView。Tab…

Vector - CAPL - CAN x 总线信息获取

在CAN&CANFD测试中,我们经常需要获取到CAN总线的负载、错误帧、过载帧、发送错误等等CAN总线上面的信息,这些信息如此重要,但是如果真的要写代码去实现也是相当不易的,那我们该如何去获取到的呢?下面我们就来一起看…

Object方法

私人博客 许小墨のBlog —— 菜鸡博客直通车 系列文章完整版,配图更多,CSDN博文图片需要手动上传,因此文章配图较少,看不懂的可以去菜鸡博客参考一下配图! 系列文章目录 前端系列文章——传送门 JavaScript系列文章—…

柔性数组【结构体和动态内存的结合】

全文目录前言柔性数组的定义语法柔性数组的特点柔性数组的使用柔性数组的优势前言 很多人可能没有听过柔性数组这个概念,但是在C99中柔性数组是确实存在的。我个人感觉有点像动态内存和结构体的结合。 柔性数组的定义语法 结构中的最后一个元素允许是未知大小的数…

NumPy 秘籍中文第二版:三、掌握常用函数

原文:NumPy Cookbook - Second Edition 协议:CC BY-NC-SA 4.0 译者:飞龙 在本章中,我们将介绍许多常用函数: sqrt(),log(),arange(),astype()和sum()ceil(),modf()&…

《Java8实战》第1章 Java 8、9、10 以及 11 的变化

如想了解 Oracle 公司对 JDK 的最新支持情况,请访问https://www.oracle.com/technetwork/java/java-se-supportroadmap.html。所有的示例代码均可见于图灵社区本书主页 http://ituring.com.cn/book/2659“随书下载”处。 1.1 为什么要关心 Java 的变化 Java8做的…

[MAUI 项目实战] 手势控制音乐播放器(三): 动画

文章目录吸附动画确定位置平移动画回弹动画使用自定义缓动函数多重动画点击动画项目地址上一章节我们创建了手势容器控件PanContainer,它对拖拽物进行包装并响应了平移手势和点击手势。拖拽物现在虽然可以响应手势操作,但视觉效果较生硬,一个…

总结一下Redis的缓存雪崩、缓存击穿、缓存穿透

缓存是提高系统性能的一种常见手段,其中Redis是一种常用的高性能缓存数据库。但是在使用缓存时,可能会遇到一些问题,比如缓存击穿、缓存穿透、缓存雪崩等问题,本文将介绍这些问题的概念、原因以及解决方案。 缓存击穿 缓存击穿指…

SQL Server 连接查询和子查询

提示: 利用单表简单查询和多表高级查询技能,并且根据查询要求灵活使用内连接查询、外连接查询或子查询等。同时还利用内连接查询的两种格式、三种外连接查询语法格式和子查询的语法格式。 文章目录前言1.查询所有学生的学号、姓名、选修课程号和成绩方法…

Vue学习——【第四弹】

前言 上一篇文章 Vue学习——【第三弹】 中我们了解了MVVM模型,这篇文章接着学习Vue中的数据代理。 简单介绍 数据代理就是**一个对象(A)来代理对另一个对象(B)的属性操作(A一定要包含B)。**直接看定义大家可能觉得有些抽象,我们可以用代码来实现。 …

全景丨0基础学习VR全景制作,后期篇:嵌入视频前期注意事项及后期处理

大家好,欢迎观看蛙色官方系列全景摄影课程! 一、前期拍摄要点 嵌入视频的简介和用途 livepano即完全无缝融合到全景图中的热点嵌入视频。 这种无缝融合是真正无缝,从而让观者产生沉浸感和真实感。例如在场景中放入宠物、让喷泉动起来、灯光…

MPAM中PARTID的虚拟化(Virtualization)

MPAM支持对PARTID的virtualization,需要在满足所有以下条件下才能使用: 在当前的security状态下有实现EL2;支持MPAM virtualization,也就是MPAMIDR_EL1.HAS_HCR等于1; 以下是MPAM中使用virtual-to-physical PARTID ma…

Scala之面向对象

目录 Scala包: 基础语法: Scala包的三大作用: 包名的命名规范: 写包的好处: 包对象: 导包说明: 类和对象: 定义类: 封装: 构造器: 主从…

Spark 之 解析json的复杂和嵌套数据结构

本文主要使用以下几种方法: 1,get_json_object():从一个json 字符串中根据指定的json 路径抽取一个json 对象 2,from_json():从一个json 字符串中按照指定的schema格式抽取出来作为DataFrame的列 3,to_j…

【SpringMVC】第一个springmvc项目

需求: 用户在页面发起一个请求, 请求交给springmvc的控制器对象,并显示请求的处理结果(在结果页面显示一个欢迎语句)。 实现步骤: 新建web maven工程 加入依赖 spring-webmvc依赖,间接把spri…