Linux开发工具(yum,vim,git,gdb…)的使用

Linux软件包管理器yum

什么是软件

  • 在Linux下安装软件,一个通常的办法是下载到程序的源代码,并进行编译,得到可执行程序
  • 但是这样太麻烦了,于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装
  • 软件包和软件包管理器,就好比"App"和"应用商店"这样的关系
  • yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器.主要应用在Fedora, RedHat,Centos等发行版上

关于 rzsz
这个工具用于 windows机器和远端的 Linux机器通过XShell 传输文件.安装完毕之后可以通过拖拽的方式将文件上传过去

在这里插入图片描述

Linux编辑器-vim使用

vi/vim的区别简单点来说,它们都是多模式编辑器
不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面
例如:语法加亮,可视化操作不仅可以在终端运行,也可以运行于x window、 mac os、windows
推荐使用vim,因为它是系统默认装机覆盖率最高,出场率最高,功能最强大的一款文本编辑器

1.vim的基本概念

vim的三种模式(其实有很多模式,目前掌握这3种即可)
分别是:命令模式(command mode)插入模式(Insert mode)底行模式(last line mode)
各模式的功能区分:

  • 正常/普通/命令模式(Normal mode)
    控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode
  • 插入模式(Insert mode)
    只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式
  • 末行模式(last line mode)
    文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+: 即可进入该模式:要查看你的所有模式:打开vim,底行模式直接输入:help vim-modes
    我们这里一共有12种模式:six BASIC modes和six ADDITIONAL modes

vim [文件名]
打开文件(如果文件不存在便会直接创建一个文件)
在这里插入图片描述

vim命令模式(常见命令)

命令 释义
yy 复制将当前光标所在行
nyy 复制n行 (100n:复制100次)
p 粘贴复制行
np 粘贴n次
dd 剪切光标当前所在行
ndd 剪切n行
u 撤销操作
Ctrl + r 撤销u操作
shift + g 光标定位到文件的结尾
gg 光标定位到文件最开始
n+shift+g 光标定位文件任意行
shift+4($) 将光标定位到当前行的最结尾
shift+6(^) 将光标定位到当前行的最开始
w 以单词为单位进行光标的向前移动
b 以单词为单位进行光标的向后移动
shift + ~ 文本内容大小写转换
shift + r 进入替换模式(esc退出)
r+字符 替换光标所在字符(支持n+r+字符)
x or shift+x 删除光标所在字符or光标之前的字符
n+x 删除n个字符
h,j,k,l 光标的左,下,上,右移动

vim底行模式(常用命令)

set nu: 打开行号
set nonu: 取消行号
vs 文件名: 分屏操作(读源代码或参考另一个文件的代码)
分屏后的命令:
ctrl +w +w: 光标切屏
底行模式
:!cmd:不退出vim执行对应的命令(执行命令行,编译,运行,查看man等)

gcc/g++编译器的使用

liunx下运行gcc -v或g++ -v
在这里插入图片描述
如果安装了就会出现如图命令,没安装也可以执行:sudo yum install -y gcc-c++这个命令安装

gcc是一个专门用来编译链接C语言的编译器
g++是一个专门用来编译链接C++的编译器

背景知识

  1. 预处理(进行宏替换)
  2. 编译(生产汇编)
  3. 汇编(生成机器可识别代码)
  4. 链接(生成可执行文件或库文件)

在这里插入图片描述
gcc如何完成
格式:gcc [选项] 要编译的文件 [选项] [目标文件]

预处理(进行宏替换)

  • 预处理功能主要包括宏定义,文件包含,条件编译,去注释等
  • 预处理指令是以#号开头的代码行
  • 实例: gcc -E hello.c -o hello.i
  • 选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程
  • 选项“-o”是指目标文件,“. i”文件为已经过预处理的C原始程序

gcc -E hello.c 将预处理的结果打印在显示器,-o hello.i 将结果写入 hello.i 文件
预处理后的代码会变多,这是因为在预处理阶段stdio.h文件会被展开,然后进行宏替换,注释在预处理阶段也会被处理掉。条件编译,不符合条件的都会被去掉,只剩符合条件的运行结果

编译 (生成汇编)

  • 在这个阶段中, gc c首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后, gcc把代码翻译成汇编语言
  • 用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码
  • 实例: gcc -S hello. i -o hello.s

“-S”: 从现在开始进行程序的翻译,如果编译完成,就停下来

汇编 (生成机器可识别代码)

  • 汇编阶段是把编译阶段生成的“.s”文件转成目标文件
  • “-c”: 从现在开始进行程序的翻译,如果汇编完成,就停下来
  • 实例: gcc -c hello.s -o hello.o

连接 (生成可执行文件或库文件)

  • 在成功编译之后,就进入了链接阶段
  • 实例: gcc hello.o -o hello
    gcc mytest.c -o mytest

在这里涉及到一个重要的概念:函数库

  • 我们的C程序中,并没有定义"printf"的函数实现,且在预编译中包含的"stdio. h"中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实现’'printf"函数的呢?
  • 最后的答案是:系统把这些函数实现都被做到名为 libc. so.6 的库文件中去了,在没有特别指定时, gcc会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc. so.6库函数中去,这样就能实现函数"printf"了,而这也就是链接的作用

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

  • 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“. a”
  • 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“. so”,如前面所述的 libc. so.6 就是动态库。gcc在编译时默认使用动态库。完成了链接之后, gcc就可以生成可执行文件,如下所示。 gcchello. o -o hello
  • gcc默认生成的二进制程序, 是动态链接的, 这点可以通过 file 命令验证

f.动态链接vs静态链接

  • 动态链接: 将库中我要的方法的地址,填入我的可执行程序中,建立关联!(节省资源)
  • 静态链接: 将库中方法的实现,真的拷贝到我们的可执行程序中。(占用资源)

我们平时所说的方法,过程以及方法的实现和方法的声明,这里的方法和过程指的其实就是函数

你的机器可能因为没有静态库,而导致链接失败
动态链接必须使用 .so 动态库文件
静态链接必须使用 .a 静态库文件

动静态库下载方法

sudo yum install-y glibc-static # C静态库
sudo yum install -y libstdc+±static # C++静态库

Linux项目自动化构建工具-make/Makefile

背景

  • 会不会写makefile, 从一个侧面说明了一个人是否具备完成大型工程的能力
  • 一个工程中的源文件不计数, 其按类型、功能、模块分别放在若干个目录中, makefile定义了一系列的规则来指定, 哪些文件需要先编译, 哪些文件需要后编译, 哪些文件需要重新编译,甚至于进行更复杂的功能操作
  • makefile带来的好处就是——“自动化编译”, 一旦写好, 只需要一个make命令,整个工程完全自动编译, 极大的提高了软件开发的效率
  • make是一个命令工具,是一个解释makefile中指令的命令工具, 一般来说, 大多数的IDE都有这个命令, 比如: Delphi的make, Visual C++的nmake, Linux下GNU的make。可见, makefile都成为了一种在工程方面的编译方法
  • make是一条命令, makefile是一个文件, 两个搭配使用, 完成项目自动化构建

make 和 makefile
make是一个命令
makefile是一个文件
在这里插入图片描述
原理:
make是如何工作的,在默认的方式下,也就是我们只输入make命令

  1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件
  2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“hello”这个文件,并把这个文件作为最终的目标文件
  3. 如果hello文件不存在,或是hello所依赖的后面的hello.o文件的文件修改时间要比hello这个文件新(可以用 touch 测试),那么,他就会执行后面所定义的命令来生成hello这个文件
  4. 如果hello所依赖的hello.o文件不存在,那么make会在当前文件中找目标为hello.o文件的依赖性,如果找到则再根据那一个规则生成hello.o文件。(这有点像一个堆栈的过程)
  5. 根据上面的关系以此类推,知道所有需要的文件都生成,然后再用 hello.o 文件声明make的终极任务,也就是执行文件hello了
  6. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。(拖中华红框的内容就很好的证明了这一点,并且还生成了相应的文件)\n在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理
  7. make只管文件的依赖性,即:如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦

项目清理:

  1. 工程是需要被清理的
  2. 像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译
    但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的: 总是会根据依赖关系,执行依赖方法

clean负责项目清理,我们希望它总是被执行,所以可以用.PHONY 修饰
.PHONY 是伪目标,伪目标的特性是总是被执行

在这里插入图片描述

git

在这里插入图片描述

Linux调试器 - gdb的使用

背景

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

gdb常用命令

命令 释义
gdb [文件名] 进入调试
quit 退出gdb
l 以系统自己的方式显示源代码
l + 0 直接从第0行的位置显示源代码,默认
一次显示十行,按回车键向下翻阅代码
r 开始调试,如果没有设置断点,就直接
运行结束
b + 行号 给特定行号打断点
info + b 查看断点
d 断点编号 删除断点
n(next) 逐过程
s(step) 逐语句
p + 变量名 打印变量内容
bt 查看当前调用堆栈
finish 将当前函数跑完,就停下来
display 设置长显示,每次执行语句显示变量
内容(多用于循环)
undisplay + 编号 取消长显示
until + 编号 跳转指定行(建议只在函数内部跳转)
c 运行至下一个断点停下来
disable + 编号 使能(打开)断点
enable + 编号 使能(关闭)断点

set var 变量名=数值:循环中修改变量
gdb会记录最近一条命令,如果命令无变化,可以直接回车

扩展知识
普通用户该怎么执行sudo
先切换到root用户
执行vim /etc/sudoers 命令,光标定位到107行,yy复制,p粘贴
将光标放到复制的%wheel之后,按i,把%wheel删掉,换成普通用户的名字
强制保存,强制退出即可

在这里插入图片描述文章来源地址https://uudwc.com/A/3w1vR

原文地址:https://blog.csdn.net/2302_76421042/article/details/132364348

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

h
上一篇 2023年09月25日 04:47
api-ms-win-core-util-l1-1-0.dll文件缺失的完美解决办法
下一篇 2023年09月25日 04:48