目录
1. yum
红帽子系列linux操作系统的软件包管理工具(需要切换到root用户)
- yum 软件的安装/移除/查看
- yum list 查看所有软件 / 开发包
- yum list | grep 包名 查看能够安装的软件包
- yum list installed | grep 包名 查看已经安装的软件包
- yum install 包名 安装指定软件包
- yum remove 包名 移除已经安装的软件包
- yum list 查看所有软件 / 开发包
文件传输软件包 lrzsz
修改/更新yum源的方法: /etc/yum.repos.d/CentOS-Base.repo
2. vim文本编辑工具
-
2.1 模式
vim有12种模式(6种基本模式,6种条件模式),每一种模式都有不同的功能,针对不同的操作有不同的模式。
- 常用模式:
- 普通模式:完成各种移动光标,复制粘贴
- 插入模式:输入数据
- 底行模式:完成保存、退出
- (视图模式、替换模式)
- vim file:打开文件,进入普通模式
-
2.2 模式的切换
- 2.2.1 从普通模式切换到插入模式
i 进入插入模式,从光标所在位置开始插入
a 光标移动至下一个字符处开始插入
o 在光标所在行的下方,新建一行,进入插入模式
O 在光标所在行的上方,新建一行,进入插入模式
I 将光标移动到行首,然后进入插入模式
A 将光标移动到行尾,然后进入插入模式
s 删除光标所在字符,然后进入插入模式
- 2.2.2 从普通模式切换到底行模式
:w 保存
:q 退出
:q! 强制退出(不保存本次修改)
:wq 保存并退出
:!cmd 临时执行命令,按回车返回 (例:!pwd)
- 2.2.3 从插入模式/底行模式返回到普通模式
esc
-
2.3 普通模式下的常用操作
- 2.3.1 移动光标
h 向左移动光标
j 向下移动光标
k 向上移动光标
l 向右移动光标
w 光标向右移动一个单词(单词分界为特殊字符)
b 光标向左移动一个单词
ctrl+f / b 上下翻页
gg 光标移动到文档首行
G / shift+g 光标移动到文档末尾行
- 2.3.2 复制
yy 复制光标所在行
复制单词步骤:
1.按v进入选中模式 2.移动光标选中文本 3.按y复制选中内容 4.按p粘贴到指定位置
nyy 从光标所在行开始向下复制n行
- 2.3.3 粘贴
p 向光标所在行下方粘贴一行
P 向光标所在行上方新建粘贴一行
- 2.3.4 剪切
dd 删除光标所在行(vim中删除其实是剪切)
ndd 从光标所在行开始向下删除n行
dw 删除光标所在位置开始的一个单词
x 删除光标所在字符
- 2.3.5 其他
u 撤销操作
ctrl+r 返回撤销操作
ctrl+v 进入列视图模式,可以进行选择操作(= 缩进对齐)
v 进入行视图模式,可以进行选择操作
r 替换光标所在字符
R 进入替换模式,对内容一直替换
gg=G 全文缩进对齐 或v选中按=
- 在/etc/vimrc中设置
set nu 设置行号
set nonu 不要行号
set et 将制表符替换成相应长度的空格
set noet 不替换制表符为空格
set ai 设置自动缩进
set st=4 设置制表符的长度等于4个空格长度
set sts=4
set sw=4
3. gcc/g++编译器
将c/c++/java等高级语言程序编译成为机器可识别的指令代码
-
3.1 编译步骤
- 预处理 :去掉注释,展开所有代码
- 编译 vi :先进行语法语义纠错,没有错误则编译成汇编语言
- 汇编 :将汇编代码编译为机器指令代码。汇编只是将我们写的代码汇编完毕,但是不能运行,因为代码不完全,我们调用的一些库函数并不知道如何实现,需要经过第四步才能生成可执行程序。
- 链接 :将库函数链接过来与我们的代码最终合并生成可执行程序
- 库文件:存放函数实现代码的文件(已经汇编完成的公共代码),动态库:lib***.so ;静态库:lib***.a
- 链接方式(gcc编译器默认动态链接):
- 动态链接
- 链接动态库(共享库 / 运行时库),只记录动态库的位置符号信息。代码冗余量小,生成的可执行程序小,占用资源少,但是动态链接生成的程序运行时需要动态库存在,对库的依赖程度高。
- 静态链接
- 链接静态库,直接将库文件中的代码拷贝到可执行程序中,代码冗余量高,生成的可执行程序大,占用资源多。但是静态链接生成的程序运行时不需要静态库存在,对库的依赖程度低,因为静态链接就是将库中的函数全部拿过来生成可执行程序
- 动态链接
-
3.2 gcc使用
linux下程序的执行就是告诉操作系统程序文件在哪个路径下
- gcc常用选项:
-o 指定生成的文件名称
-E 预处理
-S 编译(针对已预处理过的文件)
-c 汇编(针对已编译过的文件或源文件)
-static 静态链接(gcc默认是动态链接)
-g 开启gdb调试选项,目的是为了在可执行程序中加入调试符号信息
4. Makefile
用于定义项目编译规则的普通文件,辅助项目的自动化编译。
-
4.1 命名
Makefile或makefile
-
4.2 编写
在makefile中通常定义很多的程序编译规则,在终端命令行下敲击一个make命令,则make程序就会跑到当前目录下寻找Makefile文件,然后按照Makefile中已经规划好的编译顺序以及编译规则来完成整个项目的编译。
- 4.2.1 make命令
项目的自动化辅助构建工具
是一个解释程序,只在当前目录下找名字叫Makefile/makefile文件,逐步解释执行makefile中记录的编译规则(make只是解释规则,编译过程仍由编译器完成 )
-
到当前目录下查找makefile文件,找不到报错
-
在文件中找第一个目标对象,并把这个对象当做终极目标
-
将目标对象与依赖对象的最后一次修改时间进行对比,判断目标对象是否需要重新编译。若修改时间一样,则不重新编译,退出;若不是,重新编译。
-
为了生成终极目标,首先要保证依赖都存在,先去生成所有依赖对象(如果依赖对象不存在,会在makefile中查找依赖关系,看能否生成依赖对象,能 -> 生成;否 -> 报错退出),执行为了生成目标对象所要执行的命令.
- 特点:
make只找第一个目标对象,第一个对象命令执行完毕后就退出。因此,之后的对象是无法生成的。
#make只找第一个对象生成,其他对象不再执行
#利用all实现多个对象的生成(将想要生成的其他所有对象作为第一个对象的依赖对象,make为了生成第一个对象,会间接的去生成这些依赖对象)
all:main test
main:main.c child.c
gcc main.c child.c -o main
test:main.c child.c
gcc main.c child.c -o main
clean:
rm main *.o
make可以直接在外部直接指定要执行生成的对象
- 4.2.2 makefile 编写规则
main.c -> main
目标对象名称:依赖对象名称
[制表符\t]为了生成目标对象所执行的命令
# 注释以"#"开头
#编写规则:
#目标对象名称:依赖对象名称
#tab[\t]为了生成目标对象所要执行的命令
main:main.c child.c
gcc main.c child.c -o main
目标对象:不一定是生成,只是为了让make找到依赖关系
依赖对象:主要用于判断目标对象是否是最新的
#不一定要生成目标对象
#可以不要依赖对象但不能没有目标对象
main:
echo "hello world"
- 4.2.3 伪对象
不管对象是否为最新的,都需要重新生成(执行下边的生成命令)
- 声明伪对象:使用.PHONY
#伪对象:声明真正要生成的对象
.PHONY:main test
all:main test
main:main.c child.c
gcc main.c child.c -o main
test:main.c child.c
gcc main.c child.c -o main
#伪对象一般声明clean
#防止外部含有名为clean的文件,当make clean时,系统clean认为是最新的而不执行命令
SRC=$(wildcard ./*.c)
ALL:main main1
main:$(SRC)
gcc $@ -o $^
main1:$(SRC)
gcc -static $@ -o $^
.PHONY:clean
clean:
rm main main1
- 4.2.4 预定义变量——makefile中应提前预定好的变量
$@ 目标对象
$^ 所有的依赖对象
$< 第一个依赖对象
main:main1.c
gcc $@ -o $^
- wildcard关键字 -> 获取文件名 (eg: SRC=$(wildcard ./*.c)获取当前目录下文件名以.c结尾的文件作为变量赋值给SRC)
- $() -> 将括号中的字符串当做命令处理,命令的执行结果当做变量内容赋值给别的变量
定义变量后,该变量的使用需要在变量名前加上$符号,否则认为是字符串赋值(eg:src=main.c a=$(src) )
SRC=$(wildcard ./*.c)
ALL:main main1
main:$(SRC)
gcc -o $@ $^
main1:$(SRC)
gcc -static -o $@ $^
- 'main' is up date :目标对象已经是最新的了,不需要重新生成,make程序判断依赖文件的最后修改时间和目标对象文件 的最后修改时间,如果目标对象的时间戳大于依赖文件的时间戳,那么就证明依赖文件在上次编译后 就没有修改过,不需要重新编译。
- 变量的定义赋值:
= 普通变量定义赋值
:= 即时赋值
?= 若变量不为空,则赋值
+= 追加赋值
5. gdb程序调试工具(重点)
调试一个程序的与进行过程。
linux下程序编译默认生成release版本程序,不带有调试符号信息,程序无法被调试。所以程序调试的前提:编译生成debug版本程序,因此需要通过gcc -g开启调试。
-
5.1 步骤
- 1. gdb的开启:
- gcc -g选项来开启调试,生成可执行程序时加入一些调试符号信息。
eg:gcc -g main.c -o main
- 2. 将程序符号信息加载进入gdb中
- gdb直接加载:gdb ./main
- 进入gdb:gdb 之后运行命令: file ./main
-
5.2 gdb常用命令
- 单步调试
- run(r) 开始运行程序,程序直接跑起来
- r 参数1 参数2 参数3... r接收参数,执行程序(程序的参数在此加载)
- start 开始逐步调试
- next(n) 下一步,不跟踪进入函数
- step(s) 下一步,跟踪进入函数
- until n 直接运行到第n行停下
- list(l) 查看当前行附近代码(上下5行)
- l file:line 指定文件指定行代码查看
- print(p) 查看变量内容
- run(r) 开始运行程序,程序直接跑起来
- 断点:
- b 添加一个断点
- b file:line 给file第line行添加断点
- b n 给当前文件第n行添加断点
- b function_name 给函数(函数中的第一行代码)添加断点
- info(i) 查看调试信息
- i b 查看当前断点信息(info breakpoint)
- d 删除断点(默认删除所有断点)
- d n 删除id为n的断点,默认删除所有
- continue(c) 从断点处继续运行
- line 向当前调试的文件指定行打断点
- file:line 向指定文件的指定行打断点
- watch variable 变量监控,给变量添加断点,变量内容发生修改时,停止
- b 添加一个断点
- bt 查看函数调用栈信息(快速定位程序调用崩溃位置,在哪一个函数崩溃)
- 单步调试
6. git项目版本控制工具
git:分布式管理,为每个用户在本地创建代码仓库进行本地管理
svn:集中式管理
-
linux下的git三板斧:
- git clone https-url 从github上克隆代码到当前路径
- git add file 添加要提交的文件
- git commit -m “desc”本地提交
- git push origin master 上传代码到git服务器
- git使用ssh
- 生成ssh密钥
- ssh-keygen 提示信息回车即可
- 家目录下.ssh目录下id_rsa.pub文件中的内容就是公钥信息
- 赋值公钥信息,到git个人设置的sshkey中
- 生成ssh密钥