1、包管理器 yum
CentOS 一般使用 yum 来下载软件,Ubuntu 则使用 apt。
1.1 软件包的依赖
yum 会解决包的依赖问题(即一起帮你下载)。
1.2 镜像源
Linux 通过内置链接下载软件,由于网络限制,内地社区会拷贝资源并使用自己的链接。
| 镜像站 | 官网 | 支持发行版 |
|---|---|---|
| 清华大学 | https://mirrors.tuna.tsinghua.edu.cn | CentOS, Ubuntu, Debian, Arch, EPEL |
| 阿里云 | https://mirrors.aliyun.com | CentOS, Ubuntu, Docker |
| 华为云 | https://mirrors.huaweicloud.com | CentOS, Ubuntu |
| 网易 | http://mirrors.163.com | Ubuntu, Debian |
| 中科大 | https://mirrors.ustc.edu.cn | Arch Linux, Docker |
可以通过更改 yum 的配置文件,更改下载链接。

1.3 查找/安装/卸载软件
yum list # 有哪些安装包
yum list | grep 安装包 # 查找指定的安装包
sudo yum install -y 安装包 # 下载指定的安装包 (-y 确认下载)
sudo yum remove -y 软件 # 删除指定的软件 (-y 确认删除)
注意: 安装和删除需要 root 权限。安装到系统目录(不是其他用户的家目录),任何人都能使用。
2、编辑器 vim
注意: Esc 键可能有点慢。
2.1 命令模式 (默认)
2.1.1 撤销与反撤销
- u:撤销。
- Ctrl+r:撤销 u 操作,反撤销。
注意: 一旦退出,就不能撤销了。
2.1.2 光标定位
可以先通过底行模式显示行号。
- gg:光标定位到第一行第一个非空字符。n+gg:光标定位到第 n 行第一个非空字符。
- G (shift+g):光标定位到最后一行第一个非空字符。n+G:光标定位到第 n 行第一个非空字符。
- ^ (shift+6):光标定位到光标所在行的第一个非空白字符。
- $ (shift+4):光标定位到光标所在行的最后一个字符。
- h (左) j (下) k (上) l (右):键盘的上下左右键在一些场景下不可用。n+hjkl:移动 n 个字符。
- b:移动到上一个单词的首字母。n+b:移动到上 n 个单词的首字母。
- w:移动到下一个单词的首字母。n+w:移动到下 n 个单词的首字母。
搜索:
- # (shift+3):向上搜索当前光标下的单词,n 上一个 (正向搜索),N 下一个 (反向搜索)。
- / (shift+8):向下搜索当前光标下的单词,n 下一个 (正向搜索),N 上一个 (反向搜索)。
可以通过底行模式删除高亮。
2.1.3 复制 && 剪切 (删除) && 粘贴
- yy:复制当前行,n+yy:复制从当前行开始的 n 行。p:在下一行新建一行,粘贴。
- dd:剪切 (删除) 当前行,n+dd:剪切 (删除) 从当前行开始的 n 行。
- x:剪切 (删除) 光标位置的字符,n+x:剪切 (删除) 从光标开始的 n 个字符。
- X (shift+x):剪切 (删除) 光标前面的字符,n+X:剪切 (删除) 光标前面的 n 个字符。
对于 yy,dd:
- p:粘贴到光标下面的新建行;P (shift+p):粘贴到光标上面的新建行。
- 当然,也可以 n+p,n+P,粘贴 n 次。
对于 x,X:
- p:粘贴到光标前面;P (shift+p):粘贴到光标后面。
- 当然,也可以 n+p,n+P,粘贴 n 次。
2.1.4 替换
- r:替换光标所在的字符,n+r:替换光标及后面的 n 个字符。
- R (shift+r):命令模式进入替换模式,直接替换。
- ~ (shift+`):大小写切换。n+~:将光标及后面的 n 个字符切换大小写。
2.1.5 插入模式
插入模式可以插入字符。
- i:命令模式进入插入模式,光标不动。
- a:命令模式进入插入模式,光标后移一位。
- o:命令模式进入插入模式,向下新建一行,光标在新建行的行首。
2.1.6 V-Block 模式
Ctrl+v:进入 V-Block 模式。
常用于批量注释:
- Ctrl+v (进入 V-Block 模式)
- hjkl (选择区域,也可以 n+hjkl)
- shift+i,进入插入模式,输入 //
- Esc,进入命令模式,就一起注释了。
批量删除注释:
- Ctrl+v (进入 V-Block 模式)
- hjkl (选择区域,也可以 n+hjkl)
- 直接 x (删除光标位置的字符),自动切换到命令模式。
2.2 底行模式
- : (shift+;):英文的冒号,命令模式进入底行模式。
- set nu:显示行号,set nonu:取消行号。
- %s/src/dst/:批量替换,把所有的 src 换成 dst。
- vs new_src:再打开一个 new_src 源文件,Ctrl+ww:光标切屏。
- w (保存 vim),q (退出 vim),q! (强制退出 vim),wq (保存并退出 vim),wq! (强制保存并退出 vim)。
2.3 命令行使用 vim 的技巧
在命令行:
- vim 不存在的文件:只要 w (保存),文件会自动生成。
- vim 文件 +n:+ 号要写,打开文件,光标直接跳到第 n 行,方便快速定位编译报错的位置。
- !v:执行最近 v 开头的命令。
2.4 vim 的配置
vim 没有自动缩进,没有自动补齐等等,用起来不太方便,需要一些配置。
这里推荐一个自动化配置 (自己配置比较麻烦):
curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh
注意:
- 在普通用户下一键式安装 (root 用户容易出问题)。就改变了普通用户的 vim 配置。
- 只支持 CentOS 7。
- 失败就多试几次。安装成功后,可能需要重启一下。
- 默认是两个空格的缩进。
如果要改成四个空格的缩进,vim 家目录下的 vimrc,都改成 4。
3、编译器 gcc/g++
gcc/g++ 默认情况下会执行完整的编译流程,包括预处理、编译、汇编、链接这四个步骤,并最终生成可执行文件(或库)。
gcc 只能编译.c 文件,g++ 既能编译.c 文件也能编译.cpp 文件,其他基本相同,以下以 gcc 为例。
// 将 code.c 编译为 code 的两种格式
gcc code.c -o code // 常用
gcc -o code code.c
3.1 预处理
- 修改代码,通过头文件展开,宏替换,条件编译 (进行功能裁剪),去注释等。
- -E 选项仅进行预处理。
- 生成 .i 文件。
gcc -E code.c -o code.i
3.2 编译
- 将预处理后的代码转换为汇编代码。
- -S 选项仅生成汇编代码。
- 生成 .s 文件。
gcc -S code.i -o code.s
3.3 汇编
- 将汇编代码转换为机器码 (CPU 能直接执行的二进制指令)。
- -c 选项仅生成目标文件。
- 生成 .o 目标文件。
- 每个源文件都编译成对应的.o 文件,能以较小的成本将代码程序编译。
gcc -c code.s -o code.o
gcc -c code.c // 默认生成,同名的.o 文件
3.4 链接
- 将多个 .o 目标文件和库文件 (.so/.a) 合并,生成最终的可执行文件或动态库。
- 直接运行 gcc 或 g++ 默认会执行链接:
gcc code.o -o code
gcc -o code code.o // 或者
Linux 中,是 lib+ 库名 + 后缀。
注意: 自己写的可执行程序,需要指定目录,才能执行。./ (当前目录)
3.4.1 动态库 (动态链接)
- Linux,.so 后缀,Windows,.dll 后缀。
- 动态库,又称共享库,被多程序共享。可执行程序的动态库不能缺失。
- 执行目标方法,需跳转到库中。文件体积小。
ldd 可执行文件或动态库,可以查看需要的动态库。
3.4.2 静态库 (静态链接)
- Linux,.a 后缀,Windows,.lib 后缀。
- 执行目标方法,会将方法拷贝过来,再执行。文件体积大。可执行程序的对静态库的依赖度小。
3.4.4 库的本质
库可以理解为,.o 文件和.h 文件的集合。
一般把文件编译到.o 文件,再与库文件链接,形成可执行程序。
两个编译过程:
- 文件包含 1.h(有方法的声明),可以过编译这关,然后给 1.o(有方法实现),链接,没问题。
- C++ 模板不支持声明和定义分离到.h.c,因为文件虽然包含了.h,预处理展开头文件,编译时实例化了声明,可以过编译这关,但是.o 的方法没有实例化,所以链接时找不到方法的实现,所以有问题。
4、自动化构建工具 make/Makefile
4.1 make
make 是命令,可以指定目标,默认执行当前目录下 Makefile 中的第一个目标。
4.2 Makefile
Makefile 或 makefile,是文件 (包含编译的指令 或 各种自动化任务)。
Makefile 主要由以下三部分组成:
目标 (target): 依赖 (prerequisites) [TAB] 命令 (recipe)
1. 目标 (Target)
- 通常是最终要生成的文件名(如
main.o) - 也可以是一个操作名称(如
clean) - 一个 Makefile 可以有多个目标
2. 依赖 (Prerequisites)
- 构建目标所需的文件或其他目标
- 可以是多个文件,用空格分隔
- 如果依赖文件比目标文件新 (目标文件应该是更新的,因为最后生成的是目标文件,当依赖文件被修改了,此时依赖文件更新,会重新编译),make 会重新构建目标。(即当改了依赖文件,make 会重新构建目标)
注意: 通过文件的 Modify(最近文件内容修改时间) 判断,是否更新。 默认没改依赖文件,就不会重新构建目标。这里会引出一个问题。如果
clean: rm -f *.o main
当执行 make clean 时,rm -f *.o main 会正常执行。
但是如果当前目录下恰好存在一个名为 clean 的文件或目录,make 会认为 clean 目标已经是最新的(因为 clean 没有依赖项),从而拒绝执行 rm 命令。
加上 .PHONY 的作用
.PHONY: clean
clean: rm -f *.o main
- 明确声明 clean 是伪目标(不是实际文件),强制 make 执行其命令,无论是否存在同名文件。
- 避免意外行为:即使有人创建了 clean 文件,make clean 也能正确执行清理操作。
- 提高可读性:明确告知开发者这是一个用于执行操作(而非生成文件)的目标。
3. 命令 (Recipe)
- 必须以 Tab 开头(不能用空格代替)
- 是要执行的 shell 命令
- 可以有多条命令,每条占一行
4.3 Makefile 的一些细节
- 直接 make,默认执行第一个目标 test(因为依赖,所以不断执行),test 依赖 test.o,test.o 依赖 test.c,所以先生成 test.o,再生成 test。
- 执行的命令会回显,前面加@就不会回显了。
- Makefile 中确实使用了类似宏定义(变量)和类似解引用(变量展开)的机制。这种设计使得 Makefile 更加灵活和可维护。如:
# 变量定义
CC := gcc
TARGET := myprogram
SRCS := main.c test.c # 空格隔开
# SRC := $(wildcard *.c) # 当前目录下所有的.c 文件
OBJS := $(SRCS:.c=.o) # 将 .c 替换为 .o
# 默认目标
$(TARGET): $(OBJS)
$(CC) -o $@ $^
# $@,是目标,$^,是所有的依赖
# 模式规则:编译 .c 到 .o,.c 为当前目录下的.c,只编译需要的.o
%.o: %.c
$(CC) -c $<
# 默认生成同名的.o 文件
# $<,是单个依赖,将.c 分别编译为.o
# 伪目标
.PHONY: clean
clean: rm -f $(OBJS) $(TARGET)
5、版本控制器 git
5.1 安装和 clone
安装 git:
sudo yum install -y git
在 gitee 创建远端仓库,点击克隆/下载,复制 https 的地址,将远端仓库克隆到本地。
git clone https地址
5.2 add&&commit&&push
可以多次 add,然后一次 commit,push。
- git add:工作区的 dir/file。
- git push(需要 gitee 的名字和登入密码)。
- git commit -m "日志信息"。第一次 commit,需填写 gitee 的名字和邮箱。
运行下面的两个指令。
注意: 一个文件/目录,每次提交修改都需要 add,commit,push,Windows 的小乌龟第一次 add,commit,push,后面只需 commit,push,简化了而已。
5.3 其他操作
- git log:查看提交记录。
- git status:检查哪些文件被修改(但未暂存);查看哪些文件已暂存(准备提交);显示未跟踪的文件(新文件,Git 尚未管理);提示当前分支状态(是否与远程分支同步)。
- git pull:将远程仓库同步到本地。(远程仓库认为是最新的,当本地仓库和远端仓库不同时,需要同步)
- 删除本地仓库和远程仓库的文件,git rm 文件名,删除了本地仓库文件,git commit -m "删除文件名",git push,删除了远程仓库文件。
- 在本地仓库中,将一些文件移动到一个新建的目录下,mkdir 新目录名,git mv 文件 (可多个) 新目录名
6、调试器 gdb/cgdb
6.1 预备知识
- 程序发布模式
- Debug 模式:包含调试信息,便于调试程序。
- Release 模式:默认模式,不包含调试信息,程序更高效。
gcc code.c -o code // gcc/g++默认 release 模式
gcc code.c -o code -g // -g 添加调试信息
- gdb 不太好用,再下载个 cgdb,封装一层,便于调试。
sudo yum install -y gdb
sudo yum install -y cgdb
- cgdb 携带调试信息的可执行程序。
6.2 常用指令
1. r&&q
- r/run:启动调试并开始执行程序。或重新调试并执行程序。
- q/quit:退出 cgdb。
2. 断点
注意: 一般是在 run 之前打断点。
- b 行号:在该行打断点。b 函数名:在函数的入口打断点。
- b 行号 if 条件:在该行打条件断点。
- info b:查看断点。cgdb 不退出,断点的编号一直增加。
- d 断点编号:删除断点。
- disable 断点编号:禁用断点。
- enable 断点编号:启用断点。
3. 跳转
- n/next:逐过程,类似于 vs2022 的 f10。
- s/step:逐语句,类似于 vs2022 的 f11。
- c:跳到逻辑上的下一个断点。
- until 行号:执行到指定行号。默认只在当前函数内生效,方便局部跳转。
- finish:直接执行完当前函数。
tip:回车——执行最近的 gdb 命令。
4. 查看
- p 变量/表达式:显示变量/表达式的值。
- info locals:显示当前栈帧的局部变量的值。
- display 变量/表达式:一直显示变量的值。undisplay 编号:不再显示。
- watch 变量/表达式:只有值变化,才显示。是一种断点,通过 d 断点编号,删除。
- bt:显示当前函数的调用栈。
- set var 变量名=值:手动修改变量的值。


