linux基本工具
yum软件包管理器
1. 什么是包管理器
在Linux下安装软件, ⼀个通常的办法是下载到程序的源代码, 并进⾏编译, 得到可执⾏程序. 但是这样太⿇烦了,
于是有些⼈把⼀些常⽤的软件提前编译好, 做成软件包(可以理解成windows上 的安装程序)放在⼀个服务器上,
通过包管理器可以很⽅便的获取到这个编译好的软件包, 直接进⾏安 装. 软件包和软件包管理器, 就好⽐ “App” 和 "应⽤商店"这样的关系.
- yum(Yellow dog Updater, Modified)是Linux下⾮常常⽤的⼀种包管理器.主要应⽤在Fedora, RedHat, Centos等发⾏版上.
- Ubuntu:主要使⽤apt(Advanced Package Tool)作为其包管理器。apt同样提供了⾃动解决依 赖关系、下载和安装软件包的功能。
2.yum具体操作
- yum -list
功能:罗列出当前共有那些软件包 - sudo yum/apt install -y 【包名字】
功能: 安装对应的软件包 - sudo yum/apt remove -y 【包名字】
功能:卸载对应的软件包
vim编辑器
vim是一款linux自带的多模式文本编辑器。
1.vim基本概念
我们主要讲解vim的三种模式(还有好多),分别是命令模式(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
总结:
2.vim基本操作
退出vim及保存文件:
进入底行模式(shift + :),w(保存),q(退出),wq(保存并退出),(w)q!(强制退出)复制,剪切与粘贴:
在命令模式下- dd表示剪切当前一行。
- yy表示复制。
- p表示粘贴
- n(数字)yy 表示复制n行。
- n(数字)dd表示剪切n行。
- n (数字)p 表示粘贴n次。
撤销:
- 命令模式下,uu表示对操作的撤销。
- 如果想撤销上一次的撤销,则输入ctrl + r
光标快速定位:
- gg : 回到文本最开始
- G(shift + g) :光标移动到最后
- n + G : 光标移动到第n行
光标局部定位: - h :光标左移
- j :下移
-k:上移 - l:右移
- $(shift + 4) :行尾
- ^(shift + 6) : 行首
- w : 以单词为单元后跳转
- b : 以单词为单元前跳转
删除字符:
- (n) x : 向后删除字符
- shift + x:向前删除字符
- shift + ~ :转换大小写
- n+r:替换
查找关键词:
- 底行模式下,/ + 关键词
- 替换关键词:
在vim的底行模式中:s 表示substitute,也就是替换, 格式为以下
:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]
range 表示区间 % 用于表示全文, 2,3 表示从第2行开始到第3行
{pattern} 表示字符串匹配规则,要匹配什么样的字符串 , 比如^a 表示以a字符起始的字符串
{string} 表示要将匹配到的字符串替换为的新的string字符串
[flags] s_flags中,g比较常用,通常使用g表示全部替换,默认如果不给的话,表示只替换一次
[count] 表示在一行中匹配多少次,很少会用到…
如果想要将文件中所有 nihao 替换为 hello 则命令为: %s/nihao/hello/g
:p 用于打印指定区间的行
:[range]p[rint] [flags]
:i 在指定行上方添加文本
:{range}i[nsert][!]
分屏:
底行模式下,输入vs + 要打开的文件名。
ctrl + ww(或者ctrl +w+ h/j/k/l)可以切换屏幕。批量注释/去注释:
编译器gcc/g++
首先我们要使用yum/apt安装gcc/g++
命令如下:
sudo yum/apt install -y gcc/g++
1.背景知识
我们首先要了解一个可执行程序是如何形成的。
- 预处理:
在这个阶段会将源文件中的宏替换,去注释,展开头文件,条件编译。在Linux系统下最终形成.i文件。 - 编译:
这一步会将.i文件编译形成汇编 — .s文件。 - 汇编:
将汇编转换成可识别机器码。形成.o文件 - 链接
形成可执行文件或库
2.gcc选项
格式 gcc [选项] 要编译的⽂件 [选项] [⽬标⽂件]
2.1 预处理
预处理功能主要包括宏定义,⽂件包含,条件编译,去注释等。
• 预处理指令是以#号开头的代码⾏。
•实例: gcc –E hello.c –o hello.i
• 选项“-E”,该选项的作⽤是让 gcc 在预处理结束后停⽌编译过程。
• 选项“-o”是指⽬标⽂件,“.i”⽂件为已经过预处理的C原始程序。
2.2 编译(生成汇编)
在这个阶段中,gcc ⾸先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的⼯作, 在检查⽆误后,gcc 把代码翻译成汇编语⾔。
• 用户可以使⽤“-S”选项来进⾏查看,该选项只进⾏编译⽽不进⾏汇编,⽣成汇编代码。
•实例: gcc –S hello.i –o hello.s
2.3 汇编
汇编阶段是把编译阶段⽣成的“.s”⽂件转成⽬标⽂件
• 用户在此可使⽤选项“-c”就可看到汇编代码已转化为“.o”的⼆进制⽬标代码了
•实例: gcc –c hello.s –o hello.o
2.4 链接
在成功编译之后,就进⼊了链接阶段。
• 实例: gcc hello.o –o hello
3.动态链接与静态链接
在我们的实际开发中,不可能将所有代码放在⼀个源⽂件中,所以会出现多个源⽂件,⽽且多个源⽂
件之间不是独⽴的,⽽会存在多种依赖关系,如⼀个源⽂件可能要调⽤另⼀个源⽂件中定义的函数,
但是每个源⽂件都是独⽴编译的,即每个*.c⽂件会形成⼀个*.o⽂件,为了满⾜前⾯说的依赖关系,则
需要将这些源⽂件产⽣的⽬标⽂件进⾏链接,从⽽形成⼀个可以执⾏的程序。这个链接的过程就是静 态链接。静态链接的缺点很明显:• 浪费空间:因为每个可执⾏程序中对所有需要的⽬标⽂件都要有⼀份副本,所以如果多个程序对同⼀个⽬标⽂件都有依赖,如多个程序中都调⽤了printf()函数,则这多个程序中都含printf.o,所以同⼀个⽬标⽂件都在内存存在多个副本; • 更新⽐较困难:因为每当库函数的代码修改了,这个时候就需要重新进⾏编译链接形成可执⾏程序。但是静态链接的优点就是,在可执⾏程序中已经具备了所有执⾏程序所需要的任何东西,在执⾏的时候运⾏速度快。
动态链接的出现解决了静态链接中提到问题。动态链接的基本思想是把程序按照模块拆分成各个相对
独⽴部分,在程序运⾏时才将它们链接在⼀起形成⼀个完整的程序,⽽不是像静态链接⼀样把所有程
序模块都链接成⼀个单独的可执⾏⽂件。
动态链接其实远⽐静态链接要常⽤得多。⽐如我们查看下 hello 这个可执⾏程序依赖的动态库,会发
现它就用到了⼀个c动态链接库:
$ ldd hello
linux-vdso.so.1 => (0x00007fffeb1ab000)
libc.so.6 => /lib64/libc.so.6 (0x00007ff776af5000) // C标准库
/lib64/ld-linux-x86-64.so.2 (0x00007ff776ec3000)
当我们同时有动态库和静态库时,gcc默认链接动态库,如果我们就是想要链接静态库,可以加 -static选项。
如 gcc -o hello hello.c -static
自动化构建工具 — Make/Makefile
1.什么是Makefile
会不会写makefile,从侧⾯说明了⼀个⼈是否具备完成⼤型⼯程的能⼒
• ⼀个⼯程中的源⽂件不计数,其按类型、功能、模块分别放在若⼲个⽬录中,makefile定义了⼀
系列的规则来指定,哪些⽂件需要先编译,哪些⽂件需要后编译,哪些⽂件需要重新编译,甚⾄
于进⾏更复杂的功能操作。
• makefile带来的好处就是⸺“⾃动化编译”,⼀旦写好,只需要⼀个make命令,整个⼯程完全
⾃动编译,极⼤的提⾼了软件开发的效率。
• make是⼀个命令⼯具,是⼀个解释makefile中指令的命令⼯具,⼀般来说,⼤多数的IDE都有这
个命令,⽐如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可⻅,makefile
都成为了⼀种在⼯程⽅⾯的编译⽅法。
• make是⼀条命令,makefile是⼀个⽂件,两个搭配使⽤,完成项⽬⾃动化构建。
2. 基本使用
// Makefile
BIN=code //定义BIN变量
SRC=code.cc //定义SRC变量
$(BIN):$(SRC) // 依赖关系
@g++ -o $(BIN) $(SRC) // 依赖方法 ,表示要形成 code文件就要执行该方法
.PHONY:clean // 定义伪目标
clean: // 无依赖文件列表
@rm -f $(BIN) //依赖关系
// code.cc
#include<cstdlib>
int main()
{
printf("hello world\n");
return 0;
}
写好Makefile之后,我们以后想要编译code.cc文件,就可以直接在命令行上输入make,即可编译形成code , 如果想删除code就可以执行make clean命令。
调试器gdb的使用
1.预备知识
程序的发布⽅式有两种, debug 模式和 release 模式, Linux gcc/g++ 出来的⼆进制程 序,默认是 release模式。
如果想要调试必须在debug模式下进行,所以我们在gcc形成目标文件时要加上 -g选项表示加入调试信息。
2.基础使用
- 开始调试: gdb 【file】
- 退出调试: ctrl + d / quit
命令 | 作用 | 样例 |
---|---|---|
list/ l | 显⽰源代码,从上次位置开始,每次列出10⾏ | list/l 10 |
list/l 函数名 | 列出指定函数的源代码 | list/l main |
list/l ⽂件名:⾏号 | 列出指定⽂件的源代码 | list/l mycmd.c:1 |
r/run | 程序开始执⾏ | run/r |
n/next | 单步执⾏,不进⼊函数内部 | next/n |
s/step | 单步执⾏,进⼊函数内部 | step |
break/b [⽂件名:]⾏号 | 在指定⾏号设置断点 | break 10 / break test.c:10 |
info break/b | 查看当前所有断点的信息 | info break |
finish | 执⾏到当前函数返回,然后停⽌ | finish |
print/p 表达式 | 打印表达式的值 | print start+end |
set var 变量=值 | 修改变量的值 | set var i=10 |
continue/c | 从当前位置开始连续执⾏程序 | continue |
delete/d breakpoints | 删除所有断点 | delete breakpoints |
display/undisplay 变量名 | 取消/跟踪显⽰指定变量的值(每次停⽌时) | display x |
until X⾏号 | 执⾏到指定⾏号 | until 20 |
条件断点 | 当条件成立时才出发的断点 | b 9 if i== 10 (新建断点) / b 9 ; condition 9 i==10(给已有断点加条件) |
常用的gdb调试命令都在上面了。