一、快速了解yum(简要介绍)
在linux操作系统中,我们需要进行工具/命令/程序的安装、检查和卸载等操作,这时需要用到yum。
在Linux中安装软件的方式有:源代码安装、交叉编译、直接安装rpm包,以及使用yum或apt-get。yum是Linux系统预装的一个命令,用于搜索、下载和安装相应的软件包,就如同手机上的应用商店一样,是由厂商内置的。
总之,yum相当于Linux的应用商店!
二、快速使用yum(三大基本命令)
- 搜索软件包:yum list | grep command
- 安装软件包:yum install [-y] command(这里的-y可以选择是否添加)
- 卸载软件包:yum remove command
请注意,后两条命令需要root权限执行,或者使用sudo前缀。
三、Linux编辑器-vim的使用
vi和vim的区别简单来说,它们都是多模式编辑器,vim是vi的升级版本,不仅兼容vi的所有指令,还增加了新的特性,如语法高亮、可视化操作等。vim不仅可以在终端运行,还能在X Window、Mac OS和windows上运行。
1、vim的基本概念
我们目前只需要掌握vim的三种模式:命令模式、插入模式和底行模式。
- 命令/正常/普通模式:控制屏幕光标的移动,删除字符、单词或行。(vim打开时的默认模式)
- 插入模式:只有在插入模式下才能进行文字输入,这是我们最常用的编辑模式。
- 底行模式:用于文件保存或退出,也可以进行文件替换、查找字符串、列出行号等操作。
要回到命令模式,只需按Esc键。
- 从命令模式转到插入模式:输入 o / i / a
- 从命令模式转到底行模式:输入 Shift+;
2、常用模式介绍——命令模式和底行模式
命令模式:
底行模式:
-
保存文件:在冒号后输入字母「w」即可保存文件。
-
退出vim:按「q」退出,如果无法退出,可以在「q」后加「!」强制退出。
-
保存并退出:使用「wq」组合命令,在退出时同时保存文件。
-
执行命令:在不退出vim的情况下,输入「!command」执行操作。
-
文件替换:使用「vs filename」命令,光标所在的界面即为当前编辑的界面,底行模式同样适用。
-
多终端切换:使用「CTRL + ww」进行光标在多个终端间的切换。
-
保存并退出:使用「shift zz」或「ZZ」命令。
批量注释:
- 使用「ctrl v」选择区域,然后按「shift + i」输入「//」,最后按Esc键完成批量注释。
- 批量去注释:使用「CTRL v」选择区域,然后按「d」键删除注释。
Linux编译器-gcc/g++的使用
c语言建议使用gcc编译,当然也可以使用g++;但c++语言只能使用g++编译器。
一、程序的翻译过程
1、预处理(进行宏替换)
预处理功能主要包括宏定义、文件包含、条件编译、去注释等。预处理指令是以#号开头的代码行。
头文件展开的本质是在预处理时,将头文件内容拷贝至源文件中。
实例:gcc –E hello.c –o hello.i
选项“-E”让gcc在预处理结束后停止编译过程。选项“-o”指定目标文件,“.i”文件是经过预处理的C原始程序。
2、编译(生成汇编)
在这个阶段,gcc首先检查代码的规范性和语法错误,确定代码的实际工作内容,检查无误后,将代码翻译成汇编语言。
用户可以使用“-S”选项查看,仅进行编译而不进行汇编,生成汇编代码。
实例:gcc –S hello.i –o hello.s
扩展:条件编译的用途
1:动态裁剪
通过给编译器传递不同的宏值,可以对代码进行动态裁剪。例如,一个程序有商业版和普通版,商业版有更多功能。我们不需要两份代码进行调试,只需通过传递不同的宏值在一份代码中实现动态裁剪。
2:防止头文件被重复包含
通过条件编译检查头文件是否重复包含,如果没有包含,则执行下面的代码;如果已经包含,则不执行下面的代码。
3、汇编(生成机器可识别代码)
汇编阶段将编译阶段生成的“.s”文件转成目标文件。
读者可以使用选项“-c”查看汇编代码已转化为“.o”的二进制目标代码。
实例:gcc –c hello.s –o hello.o
4、链接
在成功编译之后,进入链接阶段。
实例:gcc hello.o –o hello
函数库:
问题:我们的C程序中并没有定义“printf”函数的实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么“printf”函数的实现是在哪里?
答:系统将这些函数的实现放在了名为libc.so.6的库文件中。在没有特别指定时,gcc会在系统默认的搜索路径“/usr/lib”下查找,也就是链接到libc.so.6库函数中,从而实现“printf”函数。这就是链接的作用。
动态库和静态库的比较:
动态库(动态链接):
优点:节省资源,不会出现太多的重复代码。 缺点:对库的依赖性较强,一旦库丢失,所有使用这个库的程序都无法运行。
静态库(静态链接):
优点:不依赖库,同类型平台中都可以直接运行使用。 缺点:可执行程序体积较大,浪费资源(如磁盘、内存、网络等)。
TIP:
当gcc编译时,系统默认使用动态链接!
扩展:语言和编译器的自举过程
问:是先有语言,还是先有编译器?
答案是先有语言。
比如,先创造了C语言,然后用低级语言(汇编代码)编写一个能编译C语言的编译器,这样我们就可以编写软件了,接着用这个编译器编写一个用C语言编写的编译器。
上述过程就是语言和编译器的自举过程。
二、gcc选项