文章目录
1.Linux软件包管理器yum
1.1 什么是yum
在Linux下如何安装软件呢?
1. 源码安装
2. rpm安装包(会有依赖关系的问题,兼容性等)
3. yum安装(依赖关系已经处理好了)
所以一般情况下使用yum是最简单的安装方式。只要是安装软件,都要进行下载和安装两个过程,那么我们的机器是从哪里获取的安装包呢?yum是由yum软件服务器的,其中有着各种软件安装包的集合,我们如果需要,只需要将安装包下载到本地再进行安装。
yum其实是相当于Linux上的应用市场,是一个包管理器,解决了下载、解决依赖关系、安装、卸载的问题。yum其实在Linux上相当于一个客户端(client)(向服务器索取服务是客户端,自己提供服务是服务端)。所以使用yum是需要联网的,可以使用ping来检查是否联网
那么client是怎么知道包服务器在哪里的呢?其实client已经配置了目的服务器,以及目的服务器的软件源信息
软件源信息(配置文件):
yum去哪里下载(yum源存放地点):
Base:官方的标准源
Epel:非官方的扩展源
如果yum源是国外的网站的话,下载的速度可能会让人头疼,这时候就有必要去配置国内的yum源 CentOS 7 配置国内yum源 记得在更改之前要对原来的进行备份
1.2 yum的使用
那么yum该如何使用?我们试着来安装 sl ( sudo yum install ) :会在服务器中进行查找,匹配到之后,会进行确认,再进行下载安装。如果不希望系统进行询问确认,可以 sudo yum install -y。
为什么 yum 前最好要加 sudo :在用yum 将安装包下载到本地之后,是需要把安装包拷贝到系统中的指定目录下的,卸载时是需要移除指定目录的文件,而系统中的有些目录是不允许往里面拷贝或者移除的,这时候就需要提高权限 。CentOS在任何时刻只能允许一个 yum 运行。
然后我们再来卸载 sl ( sudo yum remove )
安装扩展源:标准的软件包放在yum服务器上,但是某些非标准的软件包是放在扩展服务上的,所以我们需要安装扩展源来供我们使用
通过 yum list 命令可以罗列出当前一共有哪些软件包. 由于包的数目可能非常之多, 这里我们需要使用 grep 命令只筛选出我们关注的包。关于 lrzsz :这个工具用于 windows 机器和远端的 Linux 机器通过 XShell 传输文件。安装完毕之后可以通过拖拽的方式将文件上传过去。例如:
rz -E :从windows传文件到Linux
sz 文件名 :从Linux传文件到windows
2. Linux文本编辑器vim
vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面。例如语法加亮,可视化操作不仅可以在终端运行,也可以运行于x window、 mac os、 windows。
2.1 vim的基本概念
vim解决的是代码编写的问题,本质是多模式的文本编辑器,vim的三种模式(其实有好多模式,目前掌握这3种即可),分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:
2.2 vim基本操作与命令模式命令集
基本操作
退出vim及保存文件,在[正常模式]下,按一下「:」冒号键进入「Last line mode」,例如:
:w (保存当前文件)
:wq (输入「wq」,存盘并退出vim)
:q! (输入q!,不存盘强制退出vim)
命令模式命令集:
2.3 底行模式命令集
在底行模式下,!后跟指令就可以不退出vim来运行指令
vs filename :分屏
ctrl + ww :在多屏幕下进行切换
2.4 简单的vim配置
配置文件的位置
常用配置选项
CentOS 7 下的 vim 配置
VimForCpp
3. Linux程序编译器gcc
gcc选项:
3.1 gcc如何完成
预处理:头文件展开,去注释,宏替换,条件编译
观察 test.c 和 test.i 中的文件有什么不同
若 test.c 文件里没有写宏,还可以在 gcc 时动态指定宏:
编译(生成汇编):
汇编(生成机器可识别码):
链接(生成可执行文件或者库文件):
目标文件,只有函数的调用,没有函数的实现,链接过程的本质是将自己的调用过程和具体的实现过程关联起来
3.2 函数库(动态库与静态库)
函数库的概念:
为什么要有库:减少当前的工作量,也是软件分工的一种表现。
我们可以使用 ldd 来查看一个可执行程序所依赖的库
.so 动态库
.a 静态库
c 是当前的库名称
函数库一般分动态库和静态库两种(去网吧上网和在家上网的例子):
gcc生成可执行程序,默认是动态链接的
如果我们不想使用默认的动态链接,想使用静态链接,我们可以在 gcc 文件后 -static (注意:在新版本的linux 系统下安装 glibc-devel、glibc和gcc-c++时,都不会安装libc.a. 只安装libc.so. 所以当使用-static时,libc.a不能使用。只能报找不到libc了,需要sudo yum install glibc-static,安装glibc-static),可见,动静态链接出来的可执行文件的大小差异甚大。
动静态库的优缺点:
动态链接:
优点:省空间(磁盘的空间,内存的空间),可执行程序体积小,加载速度快
缺点:依赖动态库,程序可移植性较差
静态链接:
优点:不依赖第三方库,程序的运行可移植性较好
缺点:浪费空间,加载速度慢
4. Linux程序调试器gdb
4.1 使用gdb之前
CentOS 7 gcc 中默认生成的可执行程序时release版本的,是不可以被调试的(debug版本加入了调试信息,release版本没有)要使用gdb时,一定要在源代码生成二进制程序的时候加上-g选项。可见,增加了调试信息的可执行文件要比没有添加调试信息的可执行文件大。
可见,Linux默认发布的可执行程序是动态链接且release方式的,可使用 -static 和 -g 来调整可执行程序的发布方式。
4.2 gdb的使用
1.list ( l ) 显示程序
简写 l ,会从合适的位置开始显示,如果想从第一行开始显示 l -1 ,继续 l ,就会继续往下显示
2.run ( r ) 运行程序
3.breakpoint ( b ) 打断点
b n :在 n 行处打断点
b 函数名 :在函数的第一行位置打断点
info b :查看断点
d 断点编号:删除断点(不是行号)
4.p 查看变量
5.next ( n ) 逐过程调试
此时说明, next 并不会进入函数
6.step ( s ) 逐语句调试
step 可以调试进入函数
7.display/undispaly 变量常显示/取消变量常显示
取消常显示 undisplay 序号 (不是变量名)
8.until 跳到任意行
9.finish 直接运行完毕对应的函数
10.continue ( c ) 直接运行到下一个断点处
11.set var 设置变量的值
12.bt 查看调用栈
5. Linux项目自动化构建工具make / makefile
当有多文件的项目时,建议将每一个文件先生成目标文件,再根据需要去链接,这样更加灵活,如果对其中一个文件进行修改,则只需要重新生成这个目标文件即可,维护的成本就减小了。
5.1 依赖关系和依赖方法
我们想要用 test.c 生成可执行程序 testout ,其中的依赖关系就是:
testout : test.o main.o ( testout 依赖 test.o 和 main.o 而生成)
test.o : test.s ( test.o 依赖 test.s 而生成)
test.s : test.i ( test.s 依赖 test.i 而生成)
test.i : test.c ( test.i 依赖 test.c 而生成)
main.o : main.s (main.o 依赖 main.s 而生成)
main.s : main.i (main.s 依赖 main.i 而生成)
main.i : main.c (main.i 依赖 main.c 而生成)
光光有依赖关系它们之间是不能够转化的,这时候需要依赖方法:
gcc -E test.c -o test.i
gcc -S test.i -o test.s
gcc -c test.s -o test.o
gcc -E main.c -o main.i
gcc -S main.i -o main.s
gcc -c main.s -o main.o
gcc main.o test.o -o testout
5.2 makefile的创建
当我们创建了makefile ,我们就需要把文件的依赖关系和依赖方法写入(注意:依赖方法一行的开头有一个制表符TAB):
另外,我们还可以用一些符号去表示它们之间的关系:
$@ : 依赖关系中的目标文件
$^ :依赖关系中的依赖文件列表
$< :依赖关系中的一个一个的依赖文件
当然我们创建了文件,也要能够删除文件,其中.PHONY代表伪目标(依赖关系总是被执行的)
如果我们要在一个makefile里生成多个可执行文件,因为make操作的是 makefile从上往下扫描的第一个文件,所以当我们写了两个可执行程序时,只会执行从上往下数的第一个,所以我们得创建一个新的伪目标
5.3 makefile的使用
5.4 小程序:打印进度条
6. git代码管理
复制 git 的URL ,进行 git clone URL,这时系统上会生成一个新的本地目录,这就是 git 在本地的管理目录,然后将要上传的文件或者目录复制到该目录下,然后进行 git 三部曲:
git add .(或者文件名)
git comment -m '提交日志’
git push (vs下 girt push origin master)
如何理解git & github & gitee:
版本控制(保留所有版本,应付大多数情况)
分支管理
多人协作