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