一、快速认识yum(简单介绍)
在Linux中,我们也要进行工具/指令/程序、安装、检查、卸载等等,需要使用到yum
在Linux中安装软件的方式:
- 源代码安装——交叉编译的工作
- rpm包直接安装
- yum/apt-get
yum:yum是我们Linux预装的一个指令,用来搜索、下载、安装对应的软件
就比如,手机上应用商店——也是一个app,并且是厂商内置的。
总而言之,yum相当于Linux的应用商店!
二、快速的使用yum(三板斧)
- yum list | grep command
- yum install [-y] command(这里的-y可加可不加)
- yum remove command
注意后面的两条语句需要root权限操作,或者加上sudo.
三、Linux编辑器-vim的使用
vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,而且
还有一些新的特性在里面。例如语法加亮,可视化操作不仅可以在终端运行,也可以运行于x window、 mac os、windows。
1、vim的基本概念
我们目前只需要掌握vim的三种模式,分别是命令模式、插入模式和底行模式。
- 命令/正常/普通模式 :控制屏幕光标的移动,字符‘字或行的删除。(vim打开的时候,默认的模式)
- 插入模式:只有在插入模式下,才可以做文字输入,该模式是我们后面用的最频繁的编辑模式
- 底行模式:文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。
想要回到命令模式,无脑Esc即可。
命令模式转到插入模式输入 o / i / a
命令模式转到底行模式输入 shift+; 也就是:
2、讨论常见模式——命令、底行
命令模式:
底行模式:
保存文件
「w」: 在冒号输入字母「w」就可以将文件保存起来
离开vim
「q」:按「q」就是退出,如果无法离开vim,可以在「q」后跟一个「!」强制离开vim。
「wq」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件。
!command :在不退出vim的前提下,执行操作
vs filename :文件替换,光标在哪一个界面,我们就正在编辑哪一个界面,底行也是一样。
CTRL + ww : 光标多终端切换
shift zz = ZZ : 保存并退出vim
批量化注释:
- ctrl v
- hjkl区域选择
- shift + i = I
- //
- Esc
批量化去注释
- CTRL v
- hjkl 区域选择
- d
Linux编译器-gcc/g++使用
C语言建议使用gcc,当然也可以使用g++;但是C++语言只能使用g++编译器编译
一、程序的翻译过程
1、预处理(进行宏替换)
预处理功能主要包括宏定义、文件包含、条件编译、去注释等。
预处理指令是以#号开头的代码行。
所谓的头文件展开,本质是在预处理的时候,将头文件内容拷贝至源文件
实例: gcc –E hello.c –o hello.i
选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。
2、编译(生成汇编)
在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查
无误后,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选项
-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
-S 编译到汇编语言不进行汇编和链接
-c 编译到目标代码
-o 文件输出到 文件
-static 此选项对生成的文件采用静态链接
-g 生成调试信息。GNU 调试器可利用该信息