Linux开发工具的使用

news2024/9/24 21:22:12

文章目录

  • vim的使用
    • 基本模式介绍
    • 光标当前行操作
    • 光标快速定位(命令行模式):
    • 插入模式的三种方式(命令行模式):
    • vim基本操作(命令行模式)
      • 底行模式的操作
  • Linux编译器 - gcc/g++的使用
  • Linux自动化构造工具 - make/makefile的使用
    • 用法:
    • make/makefile使用注意事项(基本原理):
    • 总结make/makefile
  • 进度条实现
  • git的使用 (代码管理)

vim的使用

在Linux中我们有个vim工具,我们可以在它上面进行编写代码。同时vim有很多种模式。

基本模式介绍

这里我们主要介绍三种模式:命令行模式、插入模式、底行模式

在这里插入图片描述

当我们使用vim打开一个文件时候默认就是命令行模式,此时无论我们按什么键都写不进去,同时按Esc会变为命令行模式。

当我们按i的时候,会进入插入模式,此时我们可以进行书写代码。

当我们按Esc回到命令行模式的时候,按shift + :(冒号)进入底行模式,按wq退出vim。同时底行模式下输入:set nu显示行号

光标当前行操作

  1. 复制:按两下y
  2. 拷贝:然后再按p会拷贝光标所在行的内容当指定光标出。
  3. n + p:拷贝n行
  4. 剪贴:按两下d,然后再按p会拷贝光标所在行的内容当指定光标出。
  5. 删除:按两下d
  6. 撤销:按u一步一步插销步骤
  7. 反撤销:ctrl + r,退回到撤销的上一步
  8. x : 删除当前光标位置的字符
  9. n + x:删除当前位置往后n个字符,包括当前字符
  10. shif + x:删除当前光标位置前一个字符
  11. n + shif + x:删除当前光标位置前n个字符,不包括当前字符

光标快速定位(命令行模式):

  1. 上下左右箭头,控制上下左右移动
  2. hjkL,也可以控制上下左右移动
  3. shif + g:定位到文件末尾
  4. 按两下g:定位到文件开头
  5. n + shif + g :定位到第n行
  6. shif + ^:定位到当前行开头
  7. shif + $:定位到当前行末尾
  8. b:一个单词一个单词后前走
  9. w:一个单词一个单词后后走

插入模式的三种方式(命令行模式):

  • 输入a - 往后移动一个光标位置
  • 输入i - 定位到当前位置
  • 输入o - 往下空出一行并且光标移动到空行开头

在这里插入图片描述

vim基本操作(命令行模式)

  1. ctrl + f:往下翻动一页
  2. ctrl+b:往上翻动一页

在这里插入图片描述

  1. shift + ~:切换大小写(小->大,大->小),同时切换之后往后移动一个字符。
  2. n + shift + ~:默认往后切换n个字符的大小写。
  3. r :替换光标当前位置的字符
  4. n + r:往后替换n个字符
  5. shift + r:切换为替换模式,一直往后替换,直到Esc返回命令行模式。
  6. vim 开多窗口

当我们使用vim打开一个窗口之后,切换到底行模式之后,输入:vs + 另一个文件名就可以再开一个窗口了。按住ctrl + ww,光标切换到下一个窗口。

  1. sudo提权

同时学了vim之后我们可以再来弥补一下之前残留的一个问题,当我们是普通用户的时候,我们可以使用sudo进行短暂的提权,使我们可以使用root的权限。

在这里插入图片描述


底行模式的操作

  1. w : 表示保存。
  2. q :表示退出
  3. wq:保存并退出
  4. q!:强制退出
  5. wq!:强制保存并退出
  6. / + 内容:定位文件内容,同时按n表示往下查找

Linux编译器 - gcc/g++的使用

这里以C语言文件为例,一个C语言源文件变为可执行程序经过了哪些步骤呢?这里我们有一个test.c源文件。

在这里插入图片描述

预处理 - 宏展开、取消注释等等

gcc -E test.c -o test.i

编译 - 生成汇编代码,进行语法检查。

gcc -S test.i -o test.s

汇编 - 把汇编代码翻译为机器代码

gcc -c test.s -o test.o

链接 - 生成可执行文件,进入链接

gcc test.o -o test

在这里插入图片描述

这里链接的时候就需要了解一下函数库了,在上述文件当中我们使用了printf这个库函数,那么这个库函数就在我们的函数库当中。

函数库一般分为静态库和动态库

  1. 动态库

在Windows系统中动态库后缀为.dll,Linux(.so),当我们使用printf的时候,我们其实存储的是printf在动态库中的地址,有了这个地址我们链接的时候直接去对应的动态库中查找即可。这样做的好处就是节省了空间,但是由于每一个库函数依赖的都是我们动态库里面的,如果动态库里面的文件损坏了,那么程序就不能运行

  1. 静态库

静态库则是把printf库函数的实现包了进来,这样缺点就是空间消耗大,就没有动态库那样,一个损坏其他的不能运行。

同时在Linux中有ldd命令 + 可执行程序可以查看调用了哪些动态库,Linux默认使用的是动态库。file + 可执行程序可以查看链接的时候用的是动态库还是静态库。

在这里插入图片描述

gcc test.c -o test -static

上述可以使用静态库。

在这里插入图片描述

Linux自动化构造工具 - make/makefile的使用

make:一条指令

makefile:一个文件

用法:

在这里插入图片描述

如上图,我们通过创建一个Makefile文件(这里的M小写也可以)和使用make指令,可以自动化帮我们执行编译与清理的工作。这就是make/makefile的作用。

来解释一下我们的Makefile:

# 这里主要是 proc 和 proc.c 的依赖关系,我们如何得到proc呢?依赖的是proc.c,那proc.c如果变为proc呢?
# 靠的是我们下面所写的依赖方法。
proc:proc.c
    # proc - 目标文件(可执行程序)                    
    # proc.c 生成proc所依赖的目标文件
[Tab]gcc proc.c -o proc  # 依赖方法                                                                         

当我们使用make指令的时候他会去Makefile文件从上往下查找,当找到第一个目标二年级四年的时候,会看后面所依赖的文件,调用依赖方法中的指令生成所需要的目标文件。

# phony有虚假的意思
# .PHONY:clean // .PHONY表示的是一种伪目标文件,而这个伪目标文件依赖的是什么呢?依赖的是clean
.PHONY:clean
# clean:clean后没有依赖目标,直接调用依赖方法中的指令即可。
clean:
[Tab] rm -f proc    

取消指令回显

在这里插入图片描述

如上图,当我们在编译与清理过程增加指示的时候发现不仅我们的结果输出出来,而且我们的指令也跟着显示了出来如果我们不想要显示对应的指令只需要在Makefile文件当中对应的指令前面增加@

在这里插入图片描述

make/makefile使用注意事项(基本原理):

如果我们把.PHONY放到文件开始会怎样呢?

在这里插入图片描述

如上图,我们发现当我们把**.PHONY放在文件开头的时候**,我们使用make指令,默认直接调用的是清理资源的指令而我们的编译指令还需要我们使用make + proc才可以执行。

那么我们可以得出来第一条注意事项就是:

  1. make/makefile有一个缺省的执行程序,就是我们Makefile从上往下查找到的第一个目标文件,其余所需要的目标文件都要使用make + 目标文件名。

那如果我们的proc.c文件中有报错呢?

在这里插入图片描述

如上图我们可以得出第二条注意事项

  1. 当我们make/makefile中途遇到错误的时候会直接终止程序,下面的代码不再执行

在使用make指令的时候我们发现一个问题(如下图):

我们发现当我们使用make指令之后再进行make,我们发现并不能进行编译了?这时为什么呢?

在这里插入图片描述

如上图,我们发现当我们使用,.PHONY修饰我们的proc的时候,此时生成可执行文件之后再使用make又可以继续进行编译了?

这里我们就要提一个概念了,我们一个文件当中,其实有三种时间:(Access)访问时间,(Modify)修改时间,(Change)改变时间

在这里插入图片描述

如上图可以看到,当我们对文件内容进行修改的时候,那么文件的修改时间和改变时间都发生了变化,此时我们就可以再进行编译了,之所以之前不能进行编译的原因就在于我们的时间并没有发生改变,那么编译器如何知道我们文件的时间是否改变了呢?
在这里插入图片描述

如上图,当我们对文件进行修改的时候,我们文件修改的时间肯定比之前可执行程序的修改时间要晚,那么当我们修改文件之后使用make指令,编译器就会对比这两个时间,如果我们源文件的时间晚于我们的可执行程序就说明发生了修改那么此时我们就需要再次编译否则就不能进行再编译。那上述我们加了.PHONY可以再编译的原因就是.PHONY会让编译器忽略这个时间差异,每次都当做是修改了文件来处理。

所以这里我们的第三条注意事项为:

  1. .PHONY会让编译器忽略文件时间的差异

在我们上文提到一个源文件生成可执行程序需要进过预处理,编译,汇编,链接过程,那么我们试试使用makefile把这些步骤通过一个make指令自动执行试试。

在这里插入图片描述

如上图,我们的第四条注意事项是:

  1. 当我们有多个目标文件时,我们会一个一个去查找直到找到了所依赖的文件存在的时候,才会去执行对应的指令,如果没有遇到则会有一个辅助栈依次存储对应的指令。

当然了,正常情况我们肯定不会向上面一样去写Makefile文件,我们会只保留生成.o文件和可执行程序的部分。如下:

在这里插入图片描述

但是此时我们还有一种写法:

在这里插入图片描述

这里我们第五条注意事项

  1. Makefile中可以定义变量,只不过这个变量是没有类型的!!!!!,同时定义变量的方式空格必须紧挨着变量

现在来解释一下上述代码:

bin=proc # 定义目标文件
src=proc.o  定义依赖文件                                                                                                                                                                                        $(bin):$(src)   # (bin) 可以看做是上述变量的地址 $(bin)就是上述定义的变量
     gcc $^ -o $@   
     # $@ 代表着目标文件($(bin))
     # $^ 代表的是我们所依赖的目标文件列表,就是我们依赖目标文件可以传多个。
     
%.o:%.c  # %.c代表着通配符,只要是.c为后缀的都可以传入,代表着.c文件生成同名的.o文件

     gcc -c $<
     # $< 表示接受的.c文件列表,如果我们传入了 proc1.c,proc2.c,proc3.c
     #本质上是生成:
     #			gcc -c proc1.c
     #			gcc -c proc2.c
     #			gcc -c proc3.c
.PHONY:clean
clean:
      rm -f $(src) $(bin)

那如果有两个.c文件需要编译呢?

在这里插入图片描述

如上图,我们第六条注意事项为

  1. makefile默认只能形成一个目标文件。

那么此时如何做呢?如下图:

在这里插入图片描述

当然最后我们也可以生成同一个可执行程序,只需要把$(bin2)的依赖关系去掉,然后在$(bin1)后的所依赖目标把$(src2)加上即可。

总结make/makefile

好,make/makefile我们就讲到这里,我们来总一下我们所说过的5条注意事项

  1. make/makefile有一个缺省的执行程序,就是我们Makefile从上往下查找到的第一个目标文件,其余所需要的目标文件都要使用make + 目标文件名。

  2. 当我们make/makefile中途遇到错误的时候会直接终止程序,下面的代码不再执行

  3. .PHONY会让编译器忽略文件时间的差异

  4. 当我们有多个目标文件时,我们会一个一个去查找直到找到了所依赖的文件存在的时候,才会去执行对应的指令,如果没有遇到则会有一个辅助栈依次存储对应的指令。

  5. Makefile中可以定义变量,只不过这个变量是没有类型的!!!!!,同时定义变量的方式空格必须紧挨着变量

  6. makefile默认只能形成一个目标文件。

进度条实现

那么有了上面的基础,我们可以使用Linux来实现一下进度条了,来看一下效果实现图:

在这里插入图片描述

在实现进度条之前我们有两个预备知识需要了解一下:

  1. 回车与换行

在这里插入图片描述

在C语言当中\n表示换行,但是C语言特殊处理过,\n表示效果为回车 + 换行。\r表示只回车

  1. 输出缓冲区

这里也不做过多的了解,只需举个例子即可。

在这里插入图片描述

如上图,在那两秒中我们的"hello Linux"到哪去了呢?其实就是到我们的输出缓冲区里面去了。而我们的’\n’可以强制刷新缓冲区。这里就需要使用fflush(FILE* stream)强制刷新缓冲区了。

在这里插入图片描述

C语言默认会打开三个流:stdin(标准输入流),stdout(标准输出),stderr(标准错误流)。而我们输出缓冲区就是我们的屏幕,所以我们只需要刷新stdout即可。

有了上面两个知识预备我们就可以来实现进度条了。

代码实现:

在这里插入图片描述

上述进度条只是我们的第一种,其实在实践当中我们一般都是登录界面会进行加载,那么这个加载的进度应该是跟我们加载了多少有关,而不是像上面那样固定的,所以我们实现第二个版本。

代码实现:

在这里插入图片描述

git的使用 (代码管理)

git是一种分布式多版本控制器,它可以支持多人协作,共同管理同一个项目。一下示例仓库都在gitee这个网站上方。这里我们只是为了管理我们的代码,所以只讲解基本的三板斧。

  1. git clone - 把远端仓库拷贝到本地

git clone + 仓库地址

在这里插入图片描述

  1. git add 把代码提交到暂存区

git add + 文件名,git add . 可以提交当前目录下所有文件。

  1. git commit -m “提交日志” - 把暂存区的提交到本地仓库

在这里插入图片描述

但是由于第一次使用git需要配置用户名和邮箱地址,直接把对应指令粘下来然后输入自己的即可。

  1. git push

把本地仓库的代码同步到远程的服务器上(gitee)

同时我们git可以支持windows和Linux不同系统操作同一个仓库,只不过在不同系统提交之后,在另一个系统需要使用git pull来更新不同系统的本地仓库,不然会有冲突导致提交不上去。

我们也可以使用git log 来检查我们所有的提交记录,我们的commit信息也可以看到。

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

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

相关文章

录屏软件免费版:四款热门工具全面解析!

日常生活或工作中&#xff0c;我们经常有记录屏幕的需求。今天&#xff0c;就让我们来探索几款市面上广受欢迎的免费录屏软件&#xff0c;它们不仅功能强大&#xff0c;而且完全免费&#xff0c;让屏幕录制体验更加流畅和高效。 福昕录屏大师 直达链接&#xff1a;www.foxits…

比亚迪海豹06这油耗,丈母娘都叫好

文 | AUTO芯球 作者 | 雷慢 刚一朋友问我 有没有什么好看、价格低&#xff0c; 车大、油耗还低的车&#xff0c; 开到女盆友家能第一个动筷子。 哎&#xff0c;我要给你说的这车&#xff0c; 能不能第一个动筷子 首先看你未来的丈母娘喜欢什么货色的&#xff0c; 其次你…

仿最近老火的羊了个羊 三消游戏源码,两种玩法模式,完整带后台

游戏玩儿法类似于养了个羊&#xff0c;有两种模式&#xff0c;一个是普通版。一个是王者荣耀版。 代码免费下载&#xff1a;百度网盘

广播与组播,超时检测

目录 一.超时检测 必要性 超时检测的设置方法 1. 通过函数自带的参数设置 2. 通过设置套接字属性进行设置 3. alarm函数与sigaction函数结合 二.广播与组播&#xff08;broadcast & multicast&#xff09; 1. 广播&#xff08;udp&#xff09; 理论&#xff1a…

redis底层—网络模型

1.用户空间和内核空间 2.阻塞IO 3.非阻塞IO 4.IO多路复用 select模式的三个问题&#xff1a; 能监听的FD最大不超过1024 每次select都需要把所有要监听的FD都拷贝到内核空间 每次都要遍历所有FD来判断就绪状态 poll模式的问题&#xff1a; poll利用链表解决了select中监听FD上限…

信号保存和处理

把上一篇回顾一下吧&#xff1a;共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间&#xff0c;这些进程间数据传递不再涉及到内核&#xff0c;进程不再通过执行进入内核的系统调用来传递彼此的数据 共享内存的数据结构&#xff1a; struct shmid_ds {…

3D技术在电商行业的应用有哪些?

‌3D技术在电商行业的应用广泛且多样化&#xff0c;主要涵盖以下几个方面‌&#xff1a; ‌1、商品展示‌&#xff1a; 通过3D模型进行全方位的展示&#xff0c;支持720旋转和任意缩放&#xff0c;使消费者能够更直观地了解产品的外观、结构和特点。这种展示方式不仅提高了消…

前端网络请求库:Axios

目录 1. 网络请求的基本概念 1.1 网络请求的基础HTTP协议 1.2 HTTP工作原理 1.3 TCP连接 1.31 建立TCP连接 1.31 关闭TCP连接 1.4 HTTP的请求方法 1.5 HTTP的响应状态码分类 1.6. 前端网络请求方式 2. Axios在在vue项目中的使用 2.1安装与使用 2.2 Axios使用HTTP请求…

碰撞检测 | 详解圆-矩形碰撞检测与N圆覆盖模型(附ROS C++可视化)

目录 0 专栏介绍1 N N N圆覆盖碰撞模型2 圆与矩形的碰撞检测3 算法仿真与可视化3.1 核心算法3.2 仿真实验 0 专栏介绍 &#x1f525;课设、毕设、创新竞赛必备&#xff01;&#x1f525;本专栏涉及更高阶的运动规划算法轨迹优化实战&#xff0c;包括&#xff1a;曲线生成、碰…

HCIP--<OSPF2>

目录 一&#xff0c;OSPF的不规则区域 1&#xff09;远离骨干区域的非骨干区域 2&#xff09;不连续骨干区域(和上面一样) 二&#xff0c;OSPF数据库表 三。优化OSPF的LSA&#xff08;缺少LSA的更新量&#xff09; [1]手工汇总&#xff1a;减少骨干区域的LSA [2]特殊区域&…

from T2I to T2V

生成图片 在Stable Diffusion推理过程中&#xff0c;其使用unet对一个初始化的向量不断去噪&#xff0c;并编入条件信息 c c c &#xff0c;最后使用vae-decoder将其上采样为一张图片。 计算过程&#xff1a; f l a t e n t u n e t ( f l a t e n t ) , f l a t e n t ∈ R…

frida主动调用init_array中的函数

ida打开目标so&#xff0c;查看要主动调用的函数 前提是先过掉检测frida等等&#xff0c;然后控制台启动 输出so地址 Process.findModuleByName("libmod.so") New函数 var aa new NativeFunction(ptr(0x785e002000).add(0x134EC0),"void",[]) 主动调用 a…

三种方式可以将彩色图像转成灰度图对比

有三种方式可以将彩色图像转成灰度图 1、直接imread(“1.jpg” , 0)&#xff1b;直接读取灰度图像 2、读取彩色图像然后 灰度 0.299 * 红色 0.587 * 绿色 0.114 * 蓝色进行转换 3、调用cvtColor函数cvtColor(srcImg, imgShow, COLOR_BGR2GRAY); 通过测试来对比三者的区别&…

秋招面经9.11

1. JWT的过程解析 JWT&#xff08;JSON Web Token&#xff09;是一种基于 JSON 的开放标准&#xff08;RFC 7519&#xff09;实现的用于在各方之间传递信息的紧凑且自包含的方式。JWT 是一种 token&#xff0c;可以对信息进行数字签名&#xff08;例如使用 HMAC 算法或 RSA 加…

[leetcode-python]杨辉三角2

给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: rowIndex 3 输出: [1,3,3,1]示例 2: 输入: rowIndex 0 输出: [1]示例 3: 输入: rowIndex 1 输出: [1,1]提示…

Mycat2原理介绍

Mycat介绍 Mycat原理 Mycat 核心配置 Scheam.xml 逻辑数据库和节点对应关系配置Server.xml mycat的连接配置Rule.xml. 分片规则 自动分片auto-sharding-long&#xff0c;比如0-10000节点1 &#xff0c;10001-20000节点2枚举分片sahrding-bt-intfile ,比如beijing节点1…

【828华为云征文|如何使用华为云Flexus X实例搭建私人博客:从配置到发布全指南】

文章目录 华为云Flexus X实例介绍搭建专属私人博客准备工作具体操作指南服务器环境确认宝塔软件商店操作一键部署WordPress私人博客域名解析WordPress安装初始页数据库信息配置运行安装程序配置博客信息博客管理后台&#xff08;默认为wp-login.php页面&#xff09;博客前台页面…

c语言位运算符速成

本篇文章对c语言速成系列的补充&#xff0c;其中的内容会涉及原反补以及& 、| 、 ~ 、^、位运算等等。那么&#xff0c;闲话少叙&#xff0c;我们直接进入正题 首先我们先来讲讲原反补 进制转换&#xff08;前置知识&#xff09; 在学原反补之前我们先来学几个机制转换的…

网络高级(学习)2024.9.10

目录 一、Modbus简介 1.起源 2.特点 3.应用场景 二、Modbus TCP协议 1.特点 2.协议格式 3.MBAP报文头 4.功能码 5.寄存器 &#xff08;1&#xff09;线圈寄存器&#xff0c;类比为开关量&#xff0c;每一个bit都对应一个信号的开关状态。 &#xff08;2&#xff09…

C++——STL——栈(stack)

栈的定义 栈 &#xff08; stack &#xff09;是限定仅在表的一端进行插入和删除操作的线性表&#xff0c;允许插入和删除的一端称 为栈顶&#xff0c;另一端称为栈底&#xff0c;不含任何数据元素的栈称为空栈。 栈的示意图 因为栈只能够在一端进行插入和删除&#xff0c;所以…