Linux 软件包管理器 yum
什么是软件包
在Linux下安装软件, 一个通常的办法是下载程序的源代码, 并进行编译, 得到可执行程序.
但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.软件包和软件包管理器, 就好比 "App" 和 "应用商店" 这样的关系. yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器(类比应用商店). 主要应用 Fedora,RedHat, Centos等发行版上.
注意事项
关于 yum 的所有操作必须保证主机(虚拟机)网络畅通
可以通过 ping 指令验证
查看软件包
通过 yum list 命令可以罗列出当前一共有哪些软件包. 由于包的数目可能非常之多, 这里我们需要使用 grep 命令只筛选出我们关注的包. 例如
注意事项:
1、软件包名称: 主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构.
2、"x86_64" 后缀表示64位系统的安装包, "i686" 后缀表示32位系统安装包. 选择包时要和系统匹配.
3、"el7" 表示操作系统发行版的版本. "el7" 表示的是 centos7/redhat7. "el6" 表示 centos6/redhat6.
4、最后一列, base 表示的是 "软件源" 的名称, 类似于 "小米应用商店", "华为应用商店" 这样的概念.
如何安装和卸载软件
安装软件
通过 yum, 我们可以通过很简单的一条命令完成软件的安装.
yum install [选项] 软件名
yum 会自动找到都有哪些软件包需要下载, 这时候敲 "y" 确认安装.在安装时
出现 "complete" 字样, 说明安装完成.
常用选项:
-y 不要询问直接安装
注意事项:
1、安装软件时由于需要向系统目录写入内容, 一般需要 sudo 或者切到 root 账户下才能完成.
2、yum安装软件只能一个装完了再装另一个. 正在yum安装一个软件的过程中, 如果再尝试用yum安装另外一个软件, yum会报错.
卸载软件
yum remove [选项] 软件名
常用选项:
-y 不要询问直接卸载
yum 是如何知道该去哪里下载软件的
原因是 yum 内置了软件的下整链接,它们保存在 /etc/yum.repos.d 中:
关于 rzsz
这个工具用于 windows 机器和远端的 Linux 机器通过 XShell 相互传输文件.需要通过 yum 指令安装 lrzsz.x86_64。(yum install lrzsz.x86_64)
rz 指令:将 windows 的文件上传到 Linux
也可以通过直接拖拽的方式上传
sz 文件名 指令:将 LInux 的文件上传到 windows
Linux编辑器-vim的使用
vim的基本操作
用 vim 打开文件
使用 vim + 文件名 来打开:
如果该文件不存在,那么如果该文件经过编辑(有内容),此时保存并退出会自动创建该文件。
vim 的常见模式
vim 是多模式编辑器,常见的有三种模式,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:
命令模式(Normal mode)
用 vim 打开文件后所处的模式,此时用户的所有输入都会被当做命令,不会作为文本输入。控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode
插入模式(Insert mode)
在命令模式按 i 进入。只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。
底行模式(last line mode)
在命令模式按 shift 和 : 即可进入该模式。该模式主要进行文件保存(输入 w)或退出 vim(输入 q,此时若文件没有保存会报错)或保存文件并退出(输入 wq),也可以进行文件替换,找字符串,列出行号等操作,按「ESC」键可回到命令行模式。 要查看所有模式,可以在底行模式输入:help vim-modes
命令模式命令集
切换到插入模式
按「i」切换进入插入模式「insert mode」,按“i”进入插入模式后是从光标当前位置开始输入文件;
按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;
按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。从插入模式切换为命令模式
按「ESC」键。移动光标
vim可以直接用键盘上的光标来上下左右移动,但正规的vim是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格
「w」:光标跳到下个单词的开头
「e」:光标跳到下个单词的字尾
「b」:光标回到上个单词的开头
「#l」:光标移到该行的第#个位置,如:5l,56l
[ gg ] :光标移动到文本的开头[shift+g]:光标移动到文本末端
[ (num) + p ] :粘贴 ( num 行) 到光标所在行的下一行
[ u ] :撤销
[ ctrl + r ] :取消撤销
[ shift + $ ] : 光标移动到当前行的结尾
[ shift + ^ ] : 光标移动到当前行的开头
[ shift + ~ ] :将光标所在的大写字符变为小写字符,将小写字符变为大写字符
[ (num +) r + 字符]:将光标 (包括) 所在的字符(及以后的共num个字符)变为r后输入的字符
[ shift + r ] :(替换模式)将输入作为光标所在字符的替换,按 Esc 退出
「ctrl」+「b」:屏幕往“后”移动一页
「ctrl」+「f」:屏幕往“前”移动一页
「ctrl」+「u」:屏幕往“后”移动半页
「ctrl」+「d」:屏幕往“前”移动半页删除文字
「x」:每按一次,删除光标所在位置的一个字符
「#x」:例如,「6x」表示删除光标所在位置的后面(包含自己在内)6个字符
「X」:大写的X,每按一次,删除光标所在位置的前面一个字符
「#X」:例如,「20X」表示删除光标所在位置的前面20个字符
「dd」:剪切光标所在行
「#dd」:从光标所在行开始删除#行复制
「yw」:将光标所在之处到字尾的字符复制到缓冲区中。
「#yw」:复制#个字到缓冲区
「yy」:复制光标所在行到缓冲区。
「#yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。
「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。替换
「r + 字符」:替换光标所在处的字符。
[ shift + r ] :(替换模式)将输入作为光标所在字符的替换,按 Esc 退出撤销上一次操作
「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多次回复。
「ctrl + r」: 撤销的恢复更改
「cw」:更改光标所在处的字到字尾处
「c#w」:例如,「c3w」表示更改3个字跳至指定的行
「ctrl」+「g」列出光标所在行的行号。
「#gg」:例如,「15gg」,表示移动光标至文章的第15行行首。
底行模式命令集
在使用底行模式之前,请记住先按「ESC」键确定您已经处于命令模式,再按 :即可进入底行模式。
列出行号
「set nu」: 输入「set nu」后,会在文件中的每一行前面列出行号。
[ set nonu ] : 去掉行号
跳到文件中的某一行
「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。查找字符
「/关键字」: 先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。
「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。
问题:/ 和 ?查找有和区别?操作实验一下多文件分屏
[ vs 文件名 ]:将当前文件与另一文件一起分屏
[ ctrl + ww ]:将光标移动到另一个文件
保存文件
「w」: 在冒号输入字母「w」就可以将文件保存起来,可以在「w」后跟一个「!」强制保存编译运行代码
[ gcc + 文件名] : 编译该文件
[ ./ + 文件名] : 运行
离开vim
「q」:按「q」就是退出,如果无法离开vim,可以在「q」后跟一个「!」强制离开vim。
「wq」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件,可以在「wq」后跟一个「!」强制保存并退出。
配置 vim
配置的原理
在用户的家目录中创建一个名为 .vimrc 的隐藏文件,在里面写入 set nu 保存并退出,以后用 vim 打开文件默认显示行号了。一个用户的 vim 配置文件不会影响到其他用户。
Linux编译器-gcc/g++使用
我们为什么能够在windows或者linux上进行C/C++或者其他形式的开发呢?
我们的系统中一定要提前或者后续安装上,C/C++开发相关的头文件,库文件
C/C++开发环境不仅仅指的是vs,gcc、g++,更重要的是,语言本身的头文件和库文件!
其实我们下载vs2019、vs2022时,同步也在下载c的头文件和库文件
复习:程序环境与预处理
使用方法
gcc 只能编译 c 语言代码,而 g++ 既能编译 c 也能编译 c++,但建议用 g++ 编译 c++,c 用 gcc 编译。
下面只讲解 gcc 的使用方法,g++ 与 gcc 的使用在指令方面一模一样,只需将 gcc 的 cc 改为 ++
使用 gcc 的基本格式:
gcc [选项] 要编译的文件 [选项] [目标文件]
常见选项:
-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
-S 编译到汇编语言不进行汇编和链接
-c 编译到目标代码
-o 文件输出到文件
直接生成可执行程序:
gcc 文件名 (此时默认生成 a.out 文件,会覆盖其他代码生成的 a.out 文件)
直接生成可执行程序并自定义命名:
gcc 文件名 -o 自定义文件名
或 :gcc -o 自定义文件名 文件名
对代码只进行到预处理:
gcc -E 文件名 -o 文件名.i(gcc -E 文件名 :默认输出到屏幕)
对代码只进行到编译而不进行汇编:
gcc -S 文件名 -o 文件名.s
对代码只进行到汇编而不进行链接:
gcc -c 文件名 -o 文件名.o ,
文件名.o 全称可重定位目标二进制文件,简称目标文件,不可以独立执行,需要经过链接才能执行,该文件用 vim 打开是乱码,得用 od 指令打开
-static 此选项对生成的文件优先采用静态链接,把所有的链接要求变成静态链接
例:gcc -c 文件名 -o 自定义文件名 -static
-g 生成调试信息,GNU 调试器可利用该信息。以 debug 版发布,不加该选项,默认以 release 版发布。例:gcc -c 文件名 -o 自定义文件名 -g
-static 和 -g 可以同时使用:
gcc -c 文件名 -o 自定义文件名 -g -static
-shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
-O0
-O1
-O2
-O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-w 不生成任何警告信息。
-Wall 生成所有警告信息。
链接详解(库详解)
我们的C程序中,并没有定义“printf”的函数实现,且在 “stdio.h” 中也只有该函数的声明,而没有函数的实现,那么,是在哪里实现“printf”函数的呢?
最后的答案是:系统把这些函数实现都被做到系统的某个文件中去了,库就是一些函数的具体实现。
在程序的所有源文件都生成目标文件时,通过链接器将目标文件与库链接最终形成一个可执行文件
头文件提供方法的声明,库文件提供方法的实现 +你的代码 = 你的软件
库一般分为静态库和动态库两种。
静态库优点:在程序运行时不再需要库文件。
缺点:编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,
在 Linux 下其后缀名一般为“.a”,windows 下其后缀名一般为 .lib
安装静态库:
动态库(共享库)优点:编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库(在运行时跳转到库执行,执行完后再返回函数调用处),这样可以节省磁盘空间、内存空间,安装包体积小,
缺点:一个动态库可能被多个程序使用,一旦库缺失,可能影响多个程序。
在 Linux 下其后缀名一般“.so”,windows 下其后缀名一般为 .dll 。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件
gcc默认生成的二进制程序,是默认优先动态链接的,这点可以通过 file 指令验证:
一个程序也可能既链接了静态库,由链接了动态库
库的命名规则
一般是 :lib + 名称 + .后缀( 比如 .so)+ 版本
查看一个可执行程序所依赖的动态库
ldd 指令:
语法:ldd 可执行程序名
许多指令都是用 c 语言实现的,因为它们依赖 c 语言的库
在 Linux 下如何运行程序
任何一个程序在 Linux 下是否能够运行的前提该文件能否在 Linux 找到,
- 如果该文件在当前目录下,使用 ./文件名 的方式来运行程序
- 可以使用该文件的绝对路径来运行程序,如一个程序的绝对路径是 /home/dir/test ,在命令行输入 /home/dir/test 也可以运行该程序
Linux项目自动化构建工具-make/Makefile
背景
- 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
- 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
- makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
- make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
- make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
示例
在当前目录下创建一个 c 源文件,用 vim 编写代码:
再创建一个名为 makefile (或 Makefile,首字母忽略大小写)的文件:
![]()
用 vim 在 makefile 中输入以下内容然后保存退出:
在命令行输入 make:
清理工作:不能在命令行直接用 rm 指令删除源文件,而应该这样:
在命令行输入 make clean:
依赖关系和依赖方法
依赖关系:在 makefile 文件中,有这样一句话:test:test.c 它的意思是最终形成的 test 文件是来自 test.c 的
语法:A :B1 B2 B3 .... ,A 是目标文件,B1、B2、B3是目标文件所依赖的源文件(源文件可以有多个,用空格分隔。
依赖方法:光有依赖关系是不行的,就像叫了别人名字而不告诉他你要做什么,依赖方法就是告诉如何将 test.c 文件形成 test 文件的:gcc -o test test.c
可以在依赖方法中使用的符号:在依赖方法中,可以用
$@ 表示依赖关系冒号左边的目标文件,
$^ 表示依赖关系冒号右边的源文件
@ 加在依赖方法前表示该依赖方法在 make 指令被执行后不显示在屏幕上。
原理
为了更好的理解 make 是如何工作的,将以上示例写得更加复杂一些:
makefile 文件内容:
makefile 保存并退出后,在命令行输入 make:
可以看出,make 执行依赖方法的顺序与 makefile 文件中的依赖方法的声明顺序相反,
make是如何工作的,在默认的方式下,也就是我们只输入make命令。那么,
1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2. 如果找到,它会看文件中声明的第一个目标文件(target),在上面的例子中,他会看到“test”这个文件,并把这个文件作为最终的目标文件,这个最终的目标文件是单独输入 make 之后生成的文件(如果把 clean 声明的依赖关系放在第一个,单独输入 make 之后,会执行 clean 的依赖方法),如果要生成其他文件,比如上面例子的 test.o ,可以输入 make test.o。
3. 如果 test 文件不存在,或是 test 存在但 test 所依赖的 test.o 文件的修改时间(Modify 时间)要比 test 文件新(可以用 touch 测试),那么,他就会执行后面所定义依赖方法来生成 test 文件。
4. 如果 test 所依赖的 test .o 文件不存在,那么make会在当前文件中找目标为 test .o 文件的依赖性,如果找到则再根据那个依赖方法生成 test .o 文件。(这有点像一个堆栈的过程)
5. make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
6. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么 make 就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。
7. make 只管文件的依赖性,如果在找了依赖关系之后,冒号后面的文件还是不在,make 就不工作了。8. make 是否执行成功与 makefile 里依赖方法的声明顺序无关,make 会自动推导文件对应的依赖关系。
9. makefile 里的依赖关系并不一定总是被执行,如果要让 make 指令忽略导致依赖方法没有被执行的情况,强制让该依赖方法被执行,可以在依赖关系的的前面添加 .PHONY 关键字,
让该目标文件成为伪目标。但为了提醒程序员使用最新的源文件来编译,.PHONY 一般不加在目标文件,而加在 clean 。
有关文件的时间问题
stat 指令
语法:stat 文件名
示例:
- Access:文件最近被访问的时间(用 cat 打印,用 vim 编辑)
- Modify:文件内容最近被修改的时间
- Change:文件属性最近被修改的时间(文件权限,文件大小)
这三个时间一般不会单独改变:用 vim 编辑,文件的大小改变, Access,Modify,Change就都改变了,但也可以单独改变,比如用 cat 打印,只有 Access 改变。
另外,由于 Access 改变得最频繁,而磁盘文件的访问比较慢,为了提高效率,一般 Modify 和 Change 改变一定次数 Access 才会改变。
项目清理
- 工程是需要被清理的
- 像 clean 这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显式要 make 执行。即命令—— “make clean”,以此来清除所有的目标文件,以便重新编译。
- 但是一般我们这种 clean 的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是总是被执行的。